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\n");
        else
        {
            int cnt=0;
            for(int i=l;i<=r;i++)
            {
                if(divide(i)) cnt++;
            }
            if(3*cnt<r-l+1) printf("Yes\n");
            else printf("No\n");
        }
    }
    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\n",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;\n",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\n",xx[n].a,xx[n].b,xx[n].c);
        else
            printf("impossible\n");

    }
    return 0;
}

A.Cat

主要利用异或的性质:\(00\bigoplus 01 \bigoplus 10 \bigoplus 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\n",ans);
        else printf("-1\n");
    }
    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?'\n':' ');
    }
    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\n",sum);
        }
    }
    return 0;
}

posted @ 2020-06-26 23:31  xzx9  阅读(288)  评论(0编辑  收藏  举报