• 2019徐州区域赛


    C.❤️ numbers

    素数分布定理。
    当区间长度大于 (1000) 时,直接输出 (NO)
    否则,就一个一个的找。

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    int divide(int x)
    {
        for(int i=2;i*i<=x;i++)
        {
            if(x%i==0) return 0;
        }
        return 1;
    }
    int main()
    {
        int t,l,r;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d%d",&l,&r);
            if(r-l+1>=1000) printf("Yes
    ");
            else
            {
                int cnt=0;
                for(int i=l;i<=r;i++)
                {
                    if(divide(i)) cnt++;
                }
                if(3*cnt<r-l+1) printf("Yes
    ");
                else printf("No
    ");
            }
        }
        return 0;
    }
    
    

    E.Multiply

    Miller_Rabin素数测试,pollard_rho大整数分解。
    先对 (x) 进行大整数分解,得到各个素因子:(m_1,m_2,..,m_k)。如何分别求各个因子在 (x,y!,z) 中的指数为 (a,b,c),那么答案为:(min((b-c)/a))
    注意 (S) 如果取得太大会超时。

    代码:

    //质因数分解得m1,m2,m3···mn。对于某质因子mi,设Z中有a个,X中有b个,Y!中有c个。则该质因子mi最多对应imi=(c-a)/b,再求出所有质因子中最小的那个i,即为ans
    //判断一个数是否是素数;如果不是则输出其最小的素因子
    #include <cmath>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <iostream>
    using namespace std;
    const int N=1000;//数组大小
    const int S=10;//素数测试时的变换次数
    const int maxn=1e5+5;
    typedef long long ll;
    int tol;//分解的质因子的个数
    ll factor[N],e[N];//存分解的质因子
    ll num[maxn];
    ll gcd(ll a,ll b)
    {
        return b?gcd(b,a%b):a;
    }
    ll mul(ll a,ll b,ll p)
    {
        ll res=0;
        while(b)
        {
            if(b&1) res=(res+a)%p;
            a=(a+a)%p;
            b>>=1;
        }
        return res;
    }
    ll power(ll a,ll b,ll p)
    {
        ll res=1;
        while(b)
        {
            if(b&1) res=mul(res,a,p);
            a=mul(a,a,p);
            b>>=1;
        }
        return res;
    }
    //素数测试部分:
    bool check(ll a,ll n,ll d,ll cnt)
    {
        ll res=power(a,d,n);//a^d%n
        ll last=res;
        for(int i=1;i<=cnt;i++)
        {
            res=mul(res,res,n);
            if(res==1&&last!=1&&last!=n-1)//
                return true;
            last=res;//
        }
        if(res!=1) return true;//
        return false;
    }
    bool Miller_Rabin(ll n)//判断一个大数是否是素数
    {
        if(n<2) return false;
        if(n==2) return true;
        if((n&1)==0) return false;
        ll d=n-1,cnt=0;
        while(d%2==0)//提取因子2
            d>>=1,cnt++;
        for(int i=1;i<=S;i++)
        {
            ll a=rand()%(n-1)+1;
            if(check(a,n,d,cnt))
                return false;//不是素数
        }
        return true;
    }
    
    //质因子分解部分:
    ll pollard_rho(ll n,ll k)
    {
        ll u=2,v=1;
        ll x=rand()%(n-1)+1;
        ll y=x;
        while(true)
        {
            x=(mul(x,x,n)+k)%n;
            v++;
            ll d=gcd((y-x+n)%n,n);
            if(1<d&&d<=n) return d;
            if(v==u)//floyd 判环优化
            {
                y=x;
                u<<=1;
            }
        }
    }
    //对n进行质因数分解,存入factor,k设置为127左右基本满足
    void divide(ll n,ll k)
    {
        if(n==1) return;
        if(Miller_Rabin(n))//是素数
        {
            factor[++tol]=n;
            return;
        }
        ll d=n,c=k;
        while(d==n) d=pollard_rho(n,--c);
        divide(d,c);
        divide(n/d,c);
    }
    int main()
    {
        ll x,y,z;
        int t,n;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d%lld%lld",&n,&x,&y);
            tol=0;
            for(int i=1;i<=n;i++)
                scanf("%lld",&num[i]);
            divide(x,127*1LL);
            ll ans=1e18;
            for(int i=1;i<=tol;i++)
            {
                e[i]=0;
                ll tmp=x;
                while(tmp%factor[i]==0)//x
                {
                    e[i]++;
                    tmp/=factor[i];
                }
            }
            for(int i=1;i<=tol;i++)
            {//cout<<"-->"<<factor[i]<<endl;
                ll cnt=0,cot=0,tmp;
                for(int j=1;j<=n;j++)//z
                {
                    tmp=num[j];
                    while(tmp)
                    {
                        cnt+=(tmp/factor[i]);
                        tmp/=factor[i];
                    }
                }
                tmp=y;
                while(tmp)//y
                {
                    cot+=(tmp/factor[i]);
                    tmp/=factor[i];
                }
                ans=min(ans,(cot-cnt)/e[i]);
            }
            printf("%lld
    ",ans);
        }
        return 0;
    }
    
    

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

    技巧打表。

    打表代码:

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    typedef pair<int,int>pii;
    struct node
    {
        int a,b,c,f;
    }xx[210];
    map<ll,pii>mp;
    ll power(ll x)
    {
        ll res=1;
        for(int i=1;i<=3;i++)
            res=res*x;
        return res;
    }
    void init()
    {
        ll maxn=1LL*200+1LL*5000*5000*5000;
        ll minn=1LL*200-1LL*5000*5000*5000;
        for(int i=-5000;i<=5000;i++)
        {
            int l=pow(minn-power(1LL*i),1.0/3)-5;
            int r=pow(maxn-power(1LL*i),1.0/3)+5;
            for(int j=max(max(l,i),-5000);j<=min(r,5000);j++)
            {
                ll res=power(1LL*i)+power(1LL*j);
                if(res>=minn&&res<=maxn)
                    mp[res]=make_pair(i,j);
            }
        }
        for(int i=0;i<=200;i++)
        {
            for(int j=-5000;j<=5000;j++)
            {
                ll res=i-power(1LL*j);
                if(mp.count(res))
                {
                    xx[i]=node{mp[res].first,mp[res].second,j,1};
                }
            }
        }
        for(int i=0;i<=200;i++)
            printf("xx[%d].a=%d;xx[%d].b=%d;xx[%d].c=%d;xx[%d].f=%d;
    ",i,xx[i].a,i,xx[i].b,i,xx[i].c,i,xx[i].f);
    }
    int main()
    {
        freopen("ans.txt","w",stdout);
        int t,x;
        init();
    
        return 0;
    }
    
    

    提交代码:

    #include <bits/stdc++.h>
    using namespace std;
    struct node
    {
        int a,b,c,f;
    }xx[210];
    void init()
    {
    xx[0].a=-4999;xx[0].b=0;xx[0].c=4999;xx[0].f=1;
    xx[1].a=-4999;xx[1].b=1;xx[1].c=4999;xx[1].f=1;
    xx[2].a=-4373;xx[2].b=-486;xx[2].c=4375;xx[2].f=1;
    xx[3].a=-5;xx[3].b=4;xx[3].c=4;xx[3].f=1;
    xx[4].a=0;xx[4].b=0;xx[4].c=0;xx[4].f=0;
    xx[5].a=0;xx[5].b=0;xx[5].c=0;xx[5].f=0;
    xx[6].a=-637;xx[6].b=-205;xx[6].c=644;xx[6].f=1;
    xx[7].a=-169;xx[7].b=44;xx[7].c=168;xx[7].f=1;
    xx[8].a=-4999;xx[8].b=2;xx[8].c=4999;xx[8].f=1;
    xx[9].a=-216;xx[9].b=-52;xx[9].c=217;xx[9].f=1;
    xx[10].a=-650;xx[10].b=-353;xx[10].c=683;xx[10].f=1;
    xx[11].a=-695;xx[11].b=-641;xx[11].c=843;xx[11].f=1;
    xx[12].a=-11;xx[12].b=7;xx[12].c=10;xx[12].f=1;
    xx[13].a=0;xx[13].b=0;xx[13].c=0;xx[13].f=0;
    xx[14].a=0;xx[14].b=0;xx[14].c=0;xx[14].f=0;
    xx[15].a=-265;xx[15].b=-262;xx[15].c=332;xx[15].f=1;
    xx[16].a=-4114;xx[16].b=-588;xx[16].c=4118;xx[16].f=1;
    xx[17].a=-3331;xx[17].b=2195;xx[17].c=2977;xx[17].f=1;
    xx[18].a=-1373;xx[18].b=-1276;xx[18].c=1671;xx[18].f=1;
    xx[19].a=-95;xx[19].b=47;xx[19].c=91;xx[19].f=1;
    xx[20].a=-2816;xx[20].b=-741;xx[20].c=2833;xx[20].f=1;
    xx[21].a=-401;xx[21].b=-287;xx[21].c=445;xx[21].f=1;
    xx[22].a=0;xx[22].b=0;xx[22].c=0;xx[22].f=0;
    xx[23].a=0;xx[23].b=0;xx[23].c=0;xx[23].f=0;
    xx[24].a=-10;xx[24].b=8;xx[24].c=8;xx[24].f=1;
    xx[25].a=-2683;xx[25].b=1839;xx[25].c=2357;xx[25].f=1;
    xx[26].a=-2107;xx[26].b=237;xx[26].c=2106;xx[26].f=1;
    xx[27].a=-4999;xx[27].b=3;xx[27].c=4999;xx[27].f=1;
    xx[28].a=-2268;xx[28].b=-249;xx[28].c=2269;xx[28].f=1;
    xx[29].a=-233;xx[29].b=-69;xx[29].c=235;xx[29].f=1;
    xx[30].a=0;xx[30].b=0;xx[30].c=0;xx[30].f=0;
    xx[31].a=0;xx[31].b=0;xx[31].c=0;xx[31].f=0;
    xx[32].a=0;xx[32].b=0;xx[32].c=0;xx[32].f=0;
    xx[33].a=0;xx[33].b=0;xx[33].c=0;xx[33].f=0;
    xx[34].a=-1555;xx[34].b=-244;xx[34].c=1557;xx[34].f=1;
    xx[35].a=-1120;xx[35].b=-509;xx[35].c=1154;xx[35].f=1;
    xx[36].a=-3223;xx[36].b=2358;xx[36].c=2731;xx[36].f=1;
    xx[37].a=-444;xx[37].b=-84;xx[37].c=445;xx[37].f=1;
    xx[38].a=-27;xx[38].b=16;xx[38].c=25;xx[38].f=1;
    xx[39].a=0;xx[39].b=0;xx[39].c=0;xx[39].f=0;
    xx[40].a=0;xx[40].b=0;xx[40].c=0;xx[40].f=0;
    xx[41].a=0;xx[41].b=0;xx[41].c=0;xx[41].f=0;
    xx[42].a=0;xx[42].b=0;xx[42].c=0;xx[42].f=0;
    xx[43].a=-823;xx[43].b=-307;xx[43].c=837;xx[43].f=1;
    xx[44].a=-7;xx[44].b=-5;xx[44].c=8;xx[44].f=1;
    xx[45].a=-2369;xx[45].b=1709;xx[45].c=2025;xx[45].f=1;
    xx[46].a=-758;xx[46].b=-473;xx[46].c=815;xx[46].f=1;
    xx[47].a=-141;xx[47].b=49;xx[47].c=139;xx[47].f=1;
    xx[48].a=-3950;xx[48].b=-1247;xx[48].c=3991;xx[48].f=1;
    xx[49].a=0;xx[49].b=0;xx[49].c=0;xx[49].f=0;
    xx[50].a=0;xx[50].b=0;xx[50].c=0;xx[50].f=0;
    xx[51].a=-796;xx[51].b=602;xx[51].c=659;xx[51].f=1;
    xx[52].a=0;xx[52].b=0;xx[52].c=0;xx[52].f=0;
    xx[53].a=-2263;xx[53].b=-935;xx[53].c=2315;xx[53].f=1;
    xx[54].a=-3613;xx[54].b=-3462;xx[54].c=4459;xx[54].f=1;
    xx[55].a=-3226;xx[55].b=454;xx[55].c=3223;xx[55].f=1;
    xx[56].a=-672;xx[56].b=505;xx[56].c=559;xx[56].f=1;
    xx[57].a=-998;xx[57].b=361;xx[57].c=982;xx[57].f=1;
    xx[58].a=0;xx[58].b=0;xx[58].c=0;xx[58].f=0;
    xx[59].a=0;xx[59].b=0;xx[59].c=0;xx[59].f=0;
    xx[60].a=-1201;xx[60].b=-163;xx[60].c=1202;xx[60].f=1;
    xx[61].a=-966;xx[61].b=668;xx[61].c=845;xx[61].f=1;
    xx[62].a=-2744;xx[62].b=-1561;xx[62].c=2903;xx[62].f=1;
    xx[63].a=-161;xx[63].b=102;xx[63].c=146;xx[63].f=1;
    xx[64].a=-4999;xx[64].b=4;xx[64].c=4999;xx[64].f=1;
    xx[65].a=-929;xx[65].b=403;xx[65].c=903;xx[65].f=1;
    xx[66].a=1;xx[66].b=1;xx[66].c=4;xx[66].f=1;
    xx[67].a=0;xx[67].b=0;xx[67].c=0;xx[67].f=0;
    xx[68].a=0;xx[68].b=0;xx[68].c=0;xx[68].f=0;
    xx[69].a=-403;xx[69].b=134;xx[69].c=398;xx[69].f=1;
    xx[70].a=-2359;xx[70].b=824;xx[70].c=2325;xx[70].f=1;
    xx[71].a=-391;xx[71].b=-333;xx[71].c=459;xx[71].f=1;
    xx[72].a=-432;xx[72].b=-104;xx[72].c=434;xx[72].f=1;
    xx[73].a=-335;xx[73].b=-146;xx[73].c=344;xx[73].f=1;
    xx[74].a=0;xx[74].b=0;xx[74].c=0;xx[74].f=0;
    xx[75].a=0;xx[75].b=0;xx[75].c=0;xx[75].f=0;
    xx[76].a=0;xx[76].b=0;xx[76].c=0;xx[76].f=0;
    xx[77].a=0;xx[77].b=0;xx[77].c=0;xx[77].f=0;
    xx[78].a=-2080;xx[78].b=-829;xx[78].c=2123;xx[78].f=1;
    xx[79].a=-706;xx[79].b=-196;xx[79].c=711;xx[79].f=1;
    xx[80].a=-1300;xx[80].b=-706;xx[80].c=1366;xx[80].f=1;
    xx[81].a=-2368;xx[81].b=-1719;xx[81].c=2638;xx[81].f=1;
    xx[82].a=-1317;xx[82].b=847;xx[82].c=1188;xx[82].f=1;
    xx[83].a=-3707;xx[83].b=1315;xx[83].c=3651;xx[83].f=1;
    xx[84].a=0;xx[84].b=0;xx[84].c=0;xx[84].f=0;
    xx[85].a=0;xx[85].b=0;xx[85].c=0;xx[85].f=0;
    xx[86].a=0;xx[86].b=0;xx[86].c=0;xx[86].f=0;
    xx[87].a=-4126;xx[87].b=-1972;xx[87].c=4271;xx[87].f=1;
    xx[88].a=-1390;xx[88].b=-1282;xx[88].c=1686;xx[88].f=1;
    xx[89].a=-2514;xx[89].b=1953;xx[89].c=2036;xx[89].f=1;
    xx[90].a=-1803;xx[90].b=365;xx[90].c=1798;xx[90].f=1;
    xx[91].a=-3389;xx[91].b=-2912;xx[91].c=3992;xx[91].f=1;
    xx[92].a=-4052;xx[92].b=861;xx[92].c=4039;xx[92].f=1;
    xx[93].a=-248;xx[93].b=-98;xx[93].c=253;xx[93].f=1;
    xx[94].a=0;xx[94].b=0;xx[94].c=0;xx[94].f=0;
    xx[95].a=0;xx[95].b=0;xx[95].c=0;xx[95].f=0;
    xx[96].a=-22;xx[96].b=14;xx[96].c=20;xx[96].f=1;
    xx[97].a=-3168;xx[97].b=-991;xx[97].c=3200;xx[97].f=1;
    xx[98].a=-2101;xx[98].b=-1638;xx[98].c=2391;xx[98].f=1;
    xx[99].a=-893;xx[99].b=-622;xx[99].c=984;xx[99].f=1;
    xx[100].a=-1797;xx[100].b=-903;xx[100].c=1870;xx[100].f=1;
    xx[101].a=-2327;xx[101].b=319;xx[101].c=2325;xx[101].f=1;
    xx[102].a=-239;xx[102].b=118;xx[102].c=229;xx[102].f=1;
    xx[103].a=0;xx[103].b=0;xx[103].c=0;xx[103].f=0;
    xx[104].a=0;xx[104].b=0;xx[104].c=0;xx[104].f=0;
    xx[105].a=-7;xx[105].b=-4;xx[105].c=8;xx[105].f=1;
    xx[106].a=-2689;xx[106].b=-1165;xx[106].c=2760;xx[106].f=1;
    xx[107].a=-1309;xx[107].b=947;xx[107].c=1117;xx[107].f=1;
    xx[108].a=-1165;xx[108].b=-948;xx[108].c=1345;xx[108].f=1;
    xx[109].a=-2948;xx[109].b=853;xx[109].c=2924;xx[109].f=1;
    xx[110].a=0;xx[110].b=0;xx[110].c=0;xx[110].f=0;
    xx[111].a=-4793;xx[111].b=-2312;xx[111].c=4966;xx[111].f=1;
    xx[112].a=0;xx[112].b=0;xx[112].c=0;xx[112].f=0;
    xx[113].a=0;xx[113].b=0;xx[113].c=0;xx[113].f=0;
    xx[114].a=0;xx[114].b=0;xx[114].c=0;xx[114].f=0;
    xx[115].a=-10;xx[115].b=-6;xx[115].c=11;xx[115].f=1;
    xx[116].a=-1906;xx[116].b=-757;xx[116].c=1945;xx[116].f=1;
    xx[117].a=-896;xx[117].b=-555;xx[117].c=962;xx[117].f=1;
    xx[118].a=-4328;xx[118].b=383;xx[118].c=4327;xx[118].f=1;
    xx[119].a=-3677;xx[119].b=-1673;xx[119].c=3789;xx[119].f=1;
    xx[120].a=-2804;xx[120].b=1219;xx[120].c=2725;xx[120].f=1;
    xx[121].a=0;xx[121].b=0;xx[121].c=0;xx[121].f=0;
    xx[122].a=0;xx[122].b=0;xx[122].c=0;xx[122].f=0;
    xx[123].a=-37;xx[123].b=-16;xx[123].c=38;xx[123].f=1;
    xx[124].a=-1;xx[124].b=0;xx[124].c=5;xx[124].f=1;
    xx[125].a=-4999;xx[125].b=5;xx[125].c=4999;xx[125].f=1;
    xx[126].a=-2212;xx[126].b=-419;xx[126].c=2217;xx[126].f=1;
    xx[127].a=-4034;xx[127].b=-3881;xx[127].c=4988;xx[127].f=1;
    xx[128].a=-3989;xx[128].b=-726;xx[128].c=3997;xx[128].f=1;
    xx[129].a=-1580;xx[129].b=-1238;xx[129].c=1801;xx[129].f=1;
    xx[130].a=0;xx[130].b=0;xx[130].c=0;xx[130].f=0;
    xx[131].a=0;xx[131].b=0;xx[131].c=0;xx[131].f=0;
    xx[132].a=-1;xx[132].b=2;xx[132].c=5;xx[132].f=1;
    xx[133].a=-399;xx[133].b=167;xx[133].c=389;xx[133].f=1;
    xx[134].a=-3013;xx[134].b=-1766;xx[134].c=3203;xx[134].f=1;
    xx[135].a=-1351;xx[135].b=-629;xx[135].c=1395;xx[135].f=1;
    xx[136].a=-782;xx[136].b=-780;xx[136].c=984;xx[136].f=1;
    xx[137].a=-758;xx[137].b=-428;xx[137].c=801;xx[137].f=1;
    xx[138].a=-86;xx[138].b=-77;xx[138].c=103;xx[138].f=1;
    xx[139].a=0;xx[139].b=0;xx[139].c=0;xx[139].f=0;
    xx[140].a=0;xx[140].b=0;xx[140].c=0;xx[140].f=0;
    xx[141].a=-139;xx[141].b=104;xx[141].c=116;xx[141].f=1;
    xx[142].a=-7;xx[142].b=-3;xx[142].c=8;xx[142].f=1;
    xx[143].a=0;xx[143].b=0;xx[143].c=0;xx[143].f=0;
    xx[144].a=-2746;xx[144].b=-2552;xx[144].c=3342;xx[144].f=1;
    xx[145].a=-8;xx[145].b=-7;xx[145].c=10;xx[145].f=1;
    xx[146].a=-327;xx[146].b=-263;xx[146].c=376;xx[146].f=1;
    xx[147].a=-2366;xx[147].b=1528;xx[147].c=2131;xx[147].f=1;
    xx[148].a=0;xx[148].b=0;xx[148].c=0;xx[148].f=0;
    xx[149].a=0;xx[149].b=0;xx[149].c=0;xx[149].f=0;
    xx[150].a=-367;xx[150].b=260;xx[150].c=317;xx[150].f=1;
    xx[151].a=-463;xx[151].b=215;xx[151].c=447;xx[151].f=1;
    xx[152].a=-805;xx[152].b=486;xx[152].c=741;xx[152].f=1;
    xx[153].a=-3736;xx[153].b=-695;xx[153].c=3744;xx[153].f=1;
    xx[154].a=-2135;xx[154].b=-516;xx[154].c=2145;xx[154].f=1;
    xx[155].a=-3693;xx[155].b=-1049;xx[155].c=3721;xx[155].f=1;
    xx[156].a=0;xx[156].b=0;xx[156].c=0;xx[156].f=0;
    xx[157].a=0;xx[157].b=0;xx[157].c=0;xx[157].f=0;
    xx[158].a=0;xx[158].b=0;xx[158].c=0;xx[158].f=0;
    xx[159].a=-1534;xx[159].b=383;xx[159].c=1526;xx[159].f=1;
    xx[160].a=-3874;xx[160].b=-1654;xx[160].c=3972;xx[160].f=1;
    xx[161].a=-4767;xx[161].b=-2476;xx[161].c=4980;xx[161].f=1;
    xx[162].a=-4125;xx[162].b=-1417;xx[162].c=4180;xx[162].f=1;
    xx[163].a=-3423;xx[163].b=-2943;xx[163].c=4033;xx[163].f=1;
    xx[164].a=-66;xx[164].b=-59;xx[164].c=79;xx[164].f=1;
    xx[165].a=0;xx[165].b=0;xx[165].c=0;xx[165].f=0;
    xx[166].a=0;xx[166].b=0;xx[166].c=0;xx[166].f=0;
    xx[167].a=0;xx[167].b=0;xx[167].c=0;xx[167].f=0;
    xx[168].a=-802;xx[168].b=-574;xx[168].c=890;xx[168].f=1;
    xx[169].a=-1354;xx[169].b=-1012;xx[169].c=1521;xx[169].f=1;
    xx[170].a=-3834;xx[170].b=-2149;xx[170].c=4047;xx[170].f=1;
    xx[171].a=-1118;xx[171].b=-894;xx[171].c=1283;xx[171].f=1;
    xx[172].a=0;xx[172].b=0;xx[172].c=0;xx[172].f=0;
    xx[173].a=0;xx[173].b=0;xx[173].c=0;xx[173].f=0;
    xx[174].a=-335;xx[174].b=-170;xx[174].c=349;xx[174].f=1;
    xx[175].a=0;xx[175].b=0;xx[175].c=0;xx[175].f=0;
    xx[176].a=0;xx[176].b=0;xx[176].c=0;xx[176].f=0;
    xx[177].a=-1168;xx[177].b=-160;xx[177].c=1169;xx[177].f=1;
    xx[178].a=-13;xx[178].b=-10;xx[178].c=15;xx[178].f=1;
    xx[179].a=-2839;xx[179].b=1503;xx[179].c=2691;xx[179].f=1;
    xx[180].a=0;xx[180].b=0;xx[180].c=0;xx[180].f=0;
    xx[181].a=-4874;xx[181].b=974;xx[181].c=4861;xx[181].f=1;
    xx[182].a=-90;xx[182].b=-29;xx[182].c=91;xx[182].f=1;
    xx[183].a=-4889;xx[183].b=976;xx[183].c=4876;xx[183].f=1;
    xx[184].a=0;xx[184].b=0;xx[184].c=0;xx[184].f=0;
    xx[185].a=0;xx[185].b=0;xx[185].c=0;xx[185].f=0;
    xx[186].a=-4;xx[186].b=5;xx[186].c=5;xx[186].f=1;
    xx[187].a=-1885;xx[187].b=-1092;xx[187].c=2000;xx[187].f=1;
    xx[188].a=-1639;xx[188].b=318;xx[188].c=1635;xx[188].f=1;
    xx[189].a=-1702;xx[189].b=-1403;xx[189].c=1974;xx[189].f=1;
    xx[190].a=-4812;xx[190].b=-593;xx[190].c=4815;xx[190].f=1;
    xx[191].a=-377;xx[191].b=-215;xx[191].c=399;xx[191].f=1;
    xx[192].a=-20;xx[192].b=16;xx[192].c=16;xx[192].f=1;
    xx[193].a=0;xx[193].b=0;xx[193].c=0;xx[193].f=0;
    xx[194].a=0;xx[194].b=0;xx[194].c=0;xx[194].f=0;
    xx[195].a=0;xx[195].b=0;xx[195].c=0;xx[195].f=0;
    xx[196].a=-1057;xx[196].b=-579;xx[196].c=1112;xx[196].f=1;
    xx[197].a=-2867;xx[197].b=-1606;xx[197].c=3026;xx[197].f=1;
    xx[198].a=-3752;xx[198].b=-1347;xx[198].c=3809;xx[198].f=1;
    xx[199].a=-2208;xx[199].b=508;xx[199].c=2199;xx[199].f=1;
    xx[200].a=-2318;xx[200].b=-638;xx[200].c=2334;xx[200].f=1;
    
    }
    int main()
    {
        int n,t;
        scanf("%d",&t);
        init();
        while(t--)
        {
            scanf("%d",&n);
            if(xx[n].f)
                printf("%d %d %d
    ",xx[n].a,xx[n].b,xx[n].c);
            else
                printf("impossible
    ");
    
        }
        return 0;
    }
    
    

    A.Cat

    主要利用异或的性质:(00igoplus 01 igoplus 10 igoplus 11=0)
    那么,当区间长度为 (4*k) 并且要求此循环的开始数字为偶数(一开始没注意,一直 (WA)),区间内数的异或和为 (0),因此只需要对区间的边界进行讨论即可。
    在代码实现上:
    当区间长度不大于 (4) 时,直接暴力找。
    否则,如果区间的开始数字为偶数,那么就只要对区间的右端剩余部分分类讨论即可。(之所以不用讨论左端剩余部分,是因为二者的结果一样)
    如果左端开始数字为奇数,那么左端必然剩一个数,然后右端可能会有剩余部分,对二者进行讨论即可。

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    ll ans;
    int main()
    {
        int t;
        ll l,r,s;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%lld%lld%lld",&l,&r,&s);
            ans=0;
            ll res=0,tmp=0;
            if(r-l+1<=4)
            {
                for(ll i=l;i<=r;i++)
                {
                    tmp=0;
                    for(ll j=i;j<=r;j++)
                    {
                        tmp^=j;
                        if(tmp<=s) ans=max(ans,j-i+1);
                    }
                }
            }
            else
            {
                if(l%2==0)//4个一个的循环节的开始位置必须是偶数,才能消除
                {
                    res=(r-l+1)%4;
                    tmp=0;
                    for(ll i=r-res+1;i<=r;i++)
                    {
                        tmp^=i;
                        if(tmp<=s) ans=max(ans,i-(r-res+1)+1);
                    }
                    ans+=(r-res+1-l);//注意要写在外面
                }
                else
                {
                    ll tl=l+1;
                    res=(r-tl+1)%4;
                    tmp=0;
                    for(ll i=r-res+1;i<=r;i++)
                    {
                        tmp^=i;
                        if(tmp<=s) ans=max(ans,i-(r-res+1)+1);
                    }
                    tmp=l;
                    if(tmp<=s) ans=max(ans,1LL);
                    for(ll i=r-res+1;i<=r;i++)
                    {
                        tmp^=i;
                        if(tmp<=s) ans=max(ans,i-(r-res+1)+2);
                    }
                    ans+=(r-res+1-tl);
                }
            }
            if(ans>0) printf("%lld
    ",ans);
            else printf("-1
    ");
        }
        return 0;
    }
    
    

    M.Kill the tree

    对树的重心的性质的考察:
    1.以树的重心为根的子树的大小一定大于等于树的大小的一半;
    2.两棵树通过一条边或一个点相连时,新树的重心一定在原来两个重心的连线上;
    3.树的重心一定在重儿子的子树上;
    4.一棵树最多两个重心,而且连在一起;
    代码实现上:
    通过和子树的不断合并来确定树的重心,当有两个重心时,取深度大者,便于后面以父亲的形式找出另一个重心。

    代码:

    #include<bits/stdc++.h>
    #define pb push_back
    using namespace std;
    const int N=2e5+5;
    int fa[N],depth[N],cp[N],sz[N],ans[10];
    vector<int>pic[N];
    void update(int rt,int a,int b)
    {//在两棵树的链上寻找新树的重心
        while(depth[a]>depth[rt]&&sz[rt]-sz[a]>sz[a])
            a=fa[a];
        while(depth[b]>depth[rt]&&sz[rt]-sz[b]>sz[b])
            b=fa[b];
        if(depth[a]>depth[b]) cp[rt]=a;//取深度大的为重心
        else cp[rt]=b;
    }
    void dfs(int v,int p)
    {
        fa[v]=p,sz[v]=1,cp[v]=v;
        for(int i=0;i<pic[v].size();i++)
        {
            int u=pic[v][i];
            if(u==p) continue;
            depth[u]=depth[v]+1;
            dfs(u,v);
            sz[v]+=sz[u];
            update(v,cp[v],cp[u]);
        }
    }
    int main()
    {
        int n,a,b;
        scanf("%d",&n);
        for(int i=1;i<n;i++)
        {
            scanf("%d%d",&a,&b);
            pic[a].pb(b);
            pic[b].pb(a);
        }
        depth[1]=1;
        dfs(1,0);
        for(int i=1;i<=n;i++)
        {
            int cnt=0;
            ans[++cnt]=cp[i];
            if(fa[cp[i]]&&sz[i]-sz[cp[i]]==sz[cp[i]])
                ans[++cnt]=fa[cp[i]];
            sort(ans+1,ans+1+cnt);
            for(int j=1;j<=cnt;j++)
                printf("%d%c",ans[j],j==cnt?'
    ':' ');
        }
        return 0;
    }
    
    

    H.Yuuki and a problem

    一看操作 (2) 就知道要用主席树,但是带修改的主席树还不会,于是学了一下树状数组套主席树,处理带修改的问题。关键就是操作 (2) 如何处理,首先只有至少有一个 (1),才能构成 (1)。假设已经可以构成 ([1,x]),设当前区间内值为 ([1,x+1]) 的和为 (sum),那显然我们就能构成 ([1,sum])了。如果 (sum==x),那么答案就是 (x+1)。这个过程可以直接暴力,最坏情况下当前区间里的数是 ({1,2,3,5,8,13...}),在第 (27) 项就到 (2e5),最多跑 (27) 次,那么复杂度 (O(27qlog^2n))
    参考博客

    代码:

    #include<bits/stdc++.h>
    
    using namespace std;
    typedef long long ll;
    const int N=2e5+5;
    struct node
    {
        ll val;
        int ls,rs;
    }tree[N*150];
    int a[N],root[N],tmp[2][N];
    int tol,n;
    void update(int l,int r,int pos,int w,int &rt)
    {
        if(!rt) rt=++tol;
        tree[rt].val+=w;
        if(l==r) return;
        int mid=(l+r)>>1;
        if(pos<=mid) update(l,mid,pos,w,tree[rt].ls);
        else update(mid+1,r,pos,w,tree[rt].rs);
    }
    void modify(int p,int pos,int w)
    {
        for(int i=p;i<=n;i+=(i&(-i)))
            update(1,2e5,pos,w,root[i]);
    }
    ll query(int l,int r,ll pos)//注意
    {
       if(r==pos)
       {
           ll d=0;
           for(int i=1;i<=tmp[0][0];i++)
               d+=tree[tmp[0][i]].val;
            for(int i=1;i<=tmp[1][0];i++)
                d-=tree[tmp[1][i]].val;
           return d;
       }
       int mid=(l+r)>>1;
       if(pos<=mid)
       {
           for(int i=1;i<=tmp[0][0];i++)
              tmp[0][i]=tree[tmp[0][i]].ls;
           for(int i=1;i<=tmp[1][0];i++)
              tmp[1][i]=tree[tmp[1][i]].ls;
           return query(l,mid,pos);
       }
       else
       {
           ll d=0;
           for(int i=1;i<=tmp[0][0];i++)
               d+=tree[tree[tmp[0][i]].ls].val;
            for(int i=1;i<=tmp[1][0];i++)
                d-=tree[tree[tmp[1][i]].ls].val;
    
           for(int i=1;i<=tmp[0][0];i++)
               tmp[0][i]=tree[tmp[0][i]].rs;
            for(int i=1;i<=tmp[1][0];i++)
                tmp[1][i]=tree[tmp[1][i]].rs;
           return d+query(mid+1,r,pos);
       }
    }
    ll ask(int l,int r,ll p)
    {
        tmp[0][0]=0;
        tmp[1][0]=0;
        for(int i=r;i>0;i-=(i&(-i)))
            tmp[0][++tmp[0][0]]=root[i];
        for(int i=l-1;i>0;i-=(i&(-i)))
            tmp[1][++tmp[1][0]]=root[i];
        return query(1,2e5,p);
    }
    int main()
    {
        int q,op,x,y;
        tol=0;
        scanf("%d%d",&n,&q);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        for(int i=1;i<=n;i++)
            modify(i,a[i],a[i]);
        while(q--)
        {
            scanf("%d",&op);
            if(op==1)
            {
                scanf("%d%d",&x,&y);
                modify(x,a[x],-a[x]);
                a[x]=y;
                modify(x,a[x],a[x]);
            }
            else
            {
                scanf("%d%d",&x,&y);
                ll sum=1,last=0;
                //小心超时
                while(1)
                {
                    ll tt=min(sum,200000LL);//!!
                    ll t=ask(x,y,tt);
                    if(t==last) break;
                    last=t,sum=t+1;
                }
                printf("%lld
    ",sum);
            }
        }
        return 0;
    }
    
    
  • 相关阅读:
    【poj3764】 The xor-longest Path
    【poj3261】 Milk Patterns
    【poj3237】 Tree
    【bzoj2654】 tree
    【poj3122】 Pie
    【poj1011】 Sticks
    【poj1186】 方程的解数
    【poj2741】 Colored Cubes
    【poj3141】 Distant Galaxy
    【bzoj2456】 mode
  • 原文地址:https://www.cnblogs.com/1024-xzx/p/13193890.html
Copyright © 2020-2023  润新知