2019icpc徐州站 [Cloned]

A-Cat

B-Cats line up

C-< 3 numbers

题意:

给你一个l,r的区间,问[l,r]区间内因子个数小于3的数的个数与区间长度的比值是否小于三分之一,如果是,输出yes,否则,输出no

solution:

先算出l到r内质数的个数,有个板子。然后特判区间包含1的情况,因为1的因子个数也是小于3 的。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
ll check(ll v,ll n,ll ndr,ll nv){
   
    return v>=ndr?(n/v-1):(nv-v);
}
ll primenum(ll n)
{
   
    ll r=(ll)sqrt(n);
    ll ndr=n/r;
    assert(r*r<=n&&(r+1)*(r+1)>n);
    ll nv=r+ndr-1;
    std::vector<ll>S(nv+1);
    std::vector<ll>V(nv+1);
    for(ll i=0;i<r;i++){
   
        V[i]=n/(i+1);
    }
    for(ll i=r;i<nv;i++){
   
        V[i]=V[i-1]-1;
    }
    for(ll i=0;i<nv;i++){
   
        S[i]=V[i]-1;
    }
    for(ll p=2;p<=r;p++){
   
        if(S[nv-p]>S[nv-p+1]){
   
            ll sp=S[nv-p+1];
            ll p2=p*p;
            for(ll i=0;i<nv;i++){
   
                if(V[i]>=p2){
   
                    S[i]-=1ll*(S[check(V[i]/p,n,ndr,nv)]-sp);
                }
                else break;
            }
        }
    }
    return S[0];
}
int l,r;
int main()
{
   
    int t;
    scanf("%d",&t);
    while(t--)
    {
   
        scanf("%d%d",&l,&r);
        ll res=0;
        if(l>1)
            res=primenum(r)-primenum(l-1);
        if(l<=1)res=primenum(r)+1;
        if(res*3<r-l+1)
            printf("Yes\n");
        else
            printf("No\n");
    }
    return 0;
}

D-Polycut

E-Multiply

题意:

给你N,X,Y,以及长度为n的数组ai,给了下图的式子

让你求最大的i是多少。

solution:

先将X分解成一堆素数相乘

那么对应于X的这些素数,Y!可以分解成对应的素数相乘,X中没出现的素数可以舍去,这里用?代替。
先引出一个定理:n的阶乘中p的幂次为


同理,对于ai!也可以这样处理。
这样就可以知道对于每个素数X中有几个,Y!中有几个,ai!中有几个,最后只要对应素数在Y!的个数减去在ai!中个数的综合再除以在X中的个数取个min就是答案。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f3f3f3f3f
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
const int C=2307;
const int S=10;
typedef pair<ll,int>pli;
mt19937 rd(time(0));
vector<ll>ve;
ll gcd(ll a,ll b){
   return b?gcd(b,a%b):a;}
ll mul(ll a,ll b,ll mod){
   return (__int128)a*b%mod;}
ll power(ll a,ll b,ll mod){
   
    ll res=1;a%=mod;
    while(b){
   
        if(b&1)res=mul(res,a,mod);
        a=mul(a,a,mod);
        b>>=1;
    }
    return res;
}
bool check(ll a,ll n){
   
    ll m=n-1,x,y;
    int j=0;
    while(!(m&1))m>>=1,j++;
    x=power(a,m,n);
    for(int i=1;i<=j;x=y,i++){
   
        y=mul(x,x,n);
        if(y==1&&x!=1&&x!=n-1)return 1;
    }
    return y!=1;
}
bool miller_rabin(ll n){
   
    ll a;
    if(n==1)return 0;
    if(n==2)return 1;
    if(!(n&1))return 0;
    for(int i=0;i<S;i++)if(check(rd()%(n-1)+1,n))return 0;
    return 1;
}
ll pollard_rho(ll n,ll c){
   
    ll i=1,k=2,x=rd()%n,y=x,d;
    while(1){
   
        i++;x=(mul(x,x,n)+c)%n,d=gcd(y-x,n);
        if(d>1&&d<n)return d;
        if(y==x)return n;
        if(i==k)y=x,k<<=1;
    }
}
void findfac(ll n,int c){
   
    if(n==1)return;
    if(miller_rabin(n)){
   
        ve.push_back(n);
        return;
    }
    ll m=n;
    while(m==n)m=pollard_rho(n,c--);
    findfac(m,c);
    findfac(n/m,c);
}
vector<pli> solve(ll n){
   
    vector<pli>res;
    ve.clear();
    findfac(n,C);
    sort(ve.begin(),ve.end());
    for(auto x:ve){
   
        if(res.empty()||res.back().first!=x)res.push_back({
   x,1});
        else res.back().second++;
    }
    return res;
}
int T;
ll x,y;
int n;
ll a[100005];
int main()
{
   
    scanf("%d",&T);
    while(T--)
    {
   
        scanf("%d%lld%lld",&n,&x,&y);
        for(int i=0;i<n;i++)
            scanf("%lld",&a[i]);
        vector<pli> res=solve(x);
        ll minn=INF;
        //cout<<res.size();
        for(auto p:res)
        {
   
            ll q=0;
            ll tem=y;
            while(tem)
            {
   
                q+=tem/p.first;
                tem/=p.first;
            }
            for(int i=0;i<n;i++)
            {
   
                ll qq=0;
                tem=a[i];
                while(tem)
                {
   
                    qq+=tem/p.first;
                    tem/=p.first;
                }
                q-=qq;
            }
            //printf("%lld %d %lld\n",p.first,p.second,q);
            minn=min(minn,q/p.second);
        }
        printf("%lld\n",minn);
    }
    return 0;
}

F-The Answer to the Ultimate Question of Life, The Universe, and Everything.

题意:

根据所给的x,求出
的一个方案,输出a,b,c的值

solution:

我是暴力打表过的,先求出在小范围内算出答案,再扩大范围算出在小范围内无解的答案

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
int t,x;
string s[210];
int main()
{
   
	s[0]="-100 0 100";
	s[1]="-100 1 100";
	s[2]="-47 -24 49";
	s[3]="-5 4 4";
	s[4]="impossible";
	s[5]="impossible";
	s[6]="-58 -43 65";
	s[7]="-1 0 2";
	s[8]="-100 2 100";
	s[9]="0 1 2";
	s[10]="-3 -3 4";
	s[11]="-2 -2 3";
	s[12]="-11 7 10";
	s[13]="impossible";
	s[14]="impossible";
	s[15]="-46 23 44";
	s[16]="-94 -48 98";
	s[17]="-52 25 50";
	s[18]="-2 -1 3";
	s[19]="-95 47 91";
	s[20]="-56 21 55";
	s[21]="-86 28 85";
	s[22]="impossible";
	s[23]="impossible";
	s[24]="-10 8 8";
	s[25]="-1 -1 3";
	s[26]="-1 0 3";
	s[27]="-100 3 100";
	s[28]="-59 31 56";
	s[29]="-20 13 18";
	s[30]="impossible";
	s[31]="impossible";
	s[32]="impossible";
	s[33]="impossible";
	s[34]="-6 5 5";
	s[35]="-13 -8 14";
	s[36]="-75 40 71";
	s[37]="-56 37 50";
	s[38]="-27 16 25";
	s[39]="impossible";
	s[40]="impossible";
	s[41]="impossible";
	s[42]="impossible";
	s[43]="-52 20 51";
	s[44]="-7 -5 8";
	s[45]="-3 2 4";
	s[46]="-29 19 26";
	s[47]="-50 -50 63";
	s[48]="-26 -23 31";
	s[49]="impossible";
	s[50]="impossible";
	s[51]="602 659 -796";
	s[52]="impossible";
	s[53]="-4 -2 5";
	s[54]="-18 -15 21";
	s[55]="-23 -23 29";
	s[56]="-47 31 42";
	s[57]="-38 25 34";
	s[58]="impossible";
	s[59]="impossible";
	s[60]="-4 -1 5";
	s[61]="-4 0 5";
	s[62]="-43 22 41";
	s[63]="-63 -37 67";
	s[64]="-100 4 100";
	s[65]="0 1 4";
	s[66]="1 1 4";
	s[67]="impossible";
	s[68]="impossible";
	s[69]="-22 -19 26";
	s[70]="-64 23 63";
	s[71]="-33 -22 36";
	s[72]="-27 -13 28";
	s[73]="-47 29 43";
	s[74]="impossible";
	s[75]="impossible";
	s[76]="impossible";
	s[77]="impossible";
	s[78]="-55 26 53";
	s[79]="-66 -49 74";
	s[80]="-6 -6 8";
	s[81]="-18 10 17";
	s[82]="-11 -11 14";
	s[83]="-36 -32 43";
	s[84]="impossible";
	s[85]="impossible";
	s[86]="impossible";
	s[87]="-4126 4271 -1972";
	s[88]="-16 -9 17";
	s[89]="-7 6 6";
	s[90]="-100 31 99";
	s[91]="-5 0 6";
	s[92]="-8 -5 9";
	s[93]="-5 -5 7";
	s[94]="impossible";
	s[95]="impossible";
	s[96]="-22 14 20";
	s[97]="-22 17 18";
	s[98]="-15 9 14";
	s[99]="-37 16 36";
	s[100]="-6 -3 7";
	s[101]="-83 46 78";
	s[102]="-239 118 229";
	s[103]="impossible";
	s[104]="impossible";
	s[105]="-7 -4 8";
	s[106]="-19 -19 24";
	s[107]="-48 -28 51";
	s[108]="-1165 1345 -948";
	s[109]="-44 -18 45";
	s[110]="impossible";
	s[111]="-4793 4966 -2312";
	s[112]="impossible";
	s[113]="impossible";
	s[114]="impossible";
	s[115]="-12 8 11";
	s[116]="-2 -1 5";
	s[117]="-2 0 5";
	s[118]="-99 76 81";
	s[119]="-14 -8 15";
	s[120]="-92 46 88";
	s[121]="impossible";
	s[122]="impossible";
	s[123]="-37 -16 38";
	s[124]="-1 0 5";
	s[125]="-100 5 100";
	s[126]="-12 -7 13";
	s[127]="-11 9 9";
	s[128]="-77 -54 85";
	s[129]="1 4 4";
	s[130]="impossible";
	s[131]="impossible";
	s[132]="-1 2 5";
	s[133]="-91 -37 93";
	s[134]="-91 49 86";
	s[135]="-28 -17 30";
	s[136]="2 4 4";
	s[137]="-30 -23 34";
	s[138]="-86 -77 103";
	s[139]="impossible";
	s[140]="impossible";
	s[141]="-19 -10 20";
	s[142]="-7 -3 8";
	s[143]="impossible";
	s[144]="-72 -25 73";
	s[145]="-8 -7 10";
	s[146]="-9 -5 10";
	s[147]="-56 -50 67";
	s[148]="impossible";
	s[149]="impossible";
	s[150]="-367 260 317";
	s[151]="-4 -1 6";
	s[152]="-32 -28 38";
	s[153]="-15 11 13";
	s[154]="-6 3 7";
	s[155]="-68 24 67";
	s[156]="impossible";
	s[157]="impossible";
	s[158]="impossible";
	s[159]="-130 80 119";
	s[160]="-76 -51 83";
	s[161]="-31 20 28";
	s[162]="-21 -14 23";
	s[163]="-76 -68 91";
	s[164]="-66 -59 79";
	s[165]="impossible";
	s[166]="impossible";
	s[167]="impossible";
	s[168]="-28 -22 32";
	s[169]="-7 0 8";
	s[170]="-38 23 35";
	s[171]="-87 67 71";
	s[172]="impossible";
	s[173]="impossible";
	s[174]="-41 31 34";
	s[175]="impossible";
	s[176]="impossible";
	s[177]="-7 2 8";
	s[178]="-13 -10 15";
	s[179]="-4 3 6";
	s[180]="impossible";
	s[181]="-59 -32 62";
	s[182]="-90 -29 91";
	s[183]="-17 10 16";
	s[184]="impossible";
	s[185]="impossible";
	s[186]="-4 5 5";
	s[187]="-58 27 56";
	s[188]="-74 -55 83";
	s[189]="-63 -29 65";
	s[190]="-89 36 87";
	s[191]="-80 63 64";
	s[192]="-20 16 16";
	s[193]="impossible";
	s[194]="impossible";
	s[195]="impossible";
	s[196]="-34 -15 35";
	s[197]="-10 -10 13";
	s[198]="-48 -19 49";
	s[199]="-73 -47 79";
	s[200]="-2 -2 6";
    /*for(int i=0;i<=200;i++) { bool flag=true; if(s[i]=="impossible") { for(int j=-5000;j<=5000;j++) { for(int k=-5000;k<=5000;k++) { ll w=pow(abs(1ll*j*j*j+1ll*k*k*k-x),1.0/3); if(1ll*j*j*j+1ll*k*k*k-x>0)w=-w; if(i==1ll*j*j*j+1ll*k*k*k+1ll*w*w*w) { printf("s[%d]=\"%d %d %d\"\n",i,j,k,w); flag=false; break; } if(!flag)break; } if(!flag)break; } if(flag) printf("s[%d]=\"impossible\"\n",i); } }*/
    cin>>t;
    while(t--)
    {
   
        cin>>x;
        cout<<s[x]<<endl;
    }
    return 0;
}

G-Factory

H-Yuuki and a problem

I-Interesting game

J-Loli, Yen-Jen, and a graph problem

K-K-rectangle

L-Loli, Yen-Jen, and a cool problem

M-Kill the tree