zoukankan      html  css  js  c++  java
  • luogu P5285 [十二省联考2019]骗分过样例

    LINK:骗分过样例

    这是去年省选的一道题答题 当时就拿了十几分 而且当时玩的很开心。

    但是 很多点都没能拿到。

    总共16个点 每个测试点都有自己的分值 这意味着我们将要写16个小程序把已经有的答案给输出出去。

    第一个点 1_998244353 输入是100000个数字 输出 显然可以发现是19的若干次幂。

    但是后面要取模 测试点提醒我们对 998244353取模即可。由于n<=30000 直接快速幂即可。

    第二点同第一个点 不过输入再long long 范围考虑欧拉降幂 %(mod-1)即可。

    第三个点同第一个点 不过输入是高精度 我们在输入的时候边读边取模即可。

    第四个点 1? 这个点输入还是30000个数字 1后面多了问号 说明了模数没有了。

    还是19的若干次幂 不过我们要先找到模数 可以暴力枚举 暴力计算 最后发现模数是 1145141

    第五个点 1?+ 观察一下输出 发现答案很大 说明模数很大 达到了1e18的数量级。

    不能再暴力枚举了(我傻了我暴力枚举。。 考虑约束一下我们的模数范围 两个很近的值 x y我们知道他们的答案 设x<y 那么我们能求出y的答案。

    显然 模数为(19^{y-x}ansx-ansy)的约束 我们从小到大枚举一下约数计算一下即可 由于模数的数量级为1e18所以100以内的约数足以。

    但是我们要先排序除了0~9的 在剩下数中找即可。(这个测试点就有点麻烦了。

    可以发现我们最后 得到了一个7e20的数据 需要枚举因数 这要高精!。。int128好好写很多 关键时刻注意借助STL 真不行就放弃。

    值得注意的是模数过大 龟速乘我知道,关键是加法爆long long 考虑开unsignedlonglong 即可。

    第六个点 1wa_998244353 输出中有了负数 结合题目下方int爆掉的提示 不难想到是int溢出了 而还有模数。

    这个时候可以发现我们int溢出之后再取模有可能还是负数 认真分析 此时应该是不能使用快速幂的 由于是1~n的输入 我们O(n)推即可。

    第七个点 第六个点的加强版 考虑我们不能O(n)推了 也不能快速幂,因为 int溢出时相当于%(2^{32}) 而此时还有%998244353.

    显然两个模数模的顺序不同造成的答案不同 这个时候最巧妙的一点是 这样做一定是有循环节的,因为没有其他的做法了。

    我们暴力寻找循环节 然后打一个简单的表 输出即可。(最后发现循环节长度不到1e5

    第8个点 2p 观察输出发现是检测区间质数 这个点可以直接线性筛搞过。

    第9个点 第8个点的加强版 区间长<=1000000 最大值 为1e12 这个时候不能暴力检测 也不能筛 我们可以采用埃式筛区间 先求出1e6的质数 再对这样质数对区间采用埃式筛即可。 这样复杂度带In 很快。

    第10个点 第9个点的加强版 区间长<=1000000 最大值为 1e18 这个时候不能采用刚才的方法了 直接上 Miller Rabin 利用费马小定理+二测探查来搞即可。
    复杂度也是带log的。值得一提的 龟速乘会T 建议以后大整数相乘开 快速乘来做。

    第11个点 观察是求莫比乌斯函数 这个点和上面的点如出一辙 直接线性筛即可。

    第12个点 范围加强了 还是考虑利用1e6里面的质数进行筛 其中每个点存一下自己被约分成什么样子及约分的次数什么的 最后再扫一遍判断。

    第13个点 范围到了1e18 这个就很难搞了 不过也有办法 我们还是拿1e6的质数去筛 想一下最后会是什么结果 其最多存在两个大约1e6的质因子。

    或者存在1个大约1e6的质因子 向刚才那样保存一下结果 最后再对结果采用Miler Rabin 判断其是一个质因子还是两个质因子 值得注意的是 如果是两个质因子还需要特判一下两个质因子是否相同。

    第14个点 判断原根 我们利用基础暴力判断原根即可。

    第15个点 考虑一种原根筛法 先找到一个原根 然后 暴力填指标 pos[i]表示原根g的x次方在mod M时同余于i的x

    判断这个x 和(phi(M-1))是否gcd>1即可。证明我也不太会。

    第16个点 显然质数应该处于中间我们从中间开始扫 MR判质数 然后暴力判结果 大概2min出解。

    找到质数后 因为 区间小直接上暴力即可。

    //#include<bits/stdc++.h>
    #include<iostream>
    #include<cstring>
    #include<string>
    #include<ctime>
    #include<cctype>
    #include<cstdio>
    #include<cmath>
    #include<cstdlib>
    #include<queue>
    #include<stack>
    #include<vector>
    #include<deque>
    #include<list>
    #include<algorithm>
    #include<utility>
    #include<bitset>
    #include<set>
    #include<map>
    #include<iomanip>
    #define ll long long
    #define db double
    #define INF 1000000000
    #define ld long double
    #define pb push_back
    #define get(x) x=read()
    #define putl(x) printf("%lld
    ",x)
    #define gt(x) scanf("%d",&x)
    #define put(x) printf("%d
    ",x)
    #define rep(p,n,i) for(RE ll i=p;i<=n;++i)
    #define go(x) for(ll i=lin[x],tn=ver[i];i;tn=ver[i=nex[i]])
    #define pii pair<ll,ll> 
    #define mk make_pair
    #define RE register
    #define mod 998244353
    #define ull unsigned long long
    #define ui unsigned ll
    using namespace std;
    char *fs,*ft,buf[1<<15];
    inline char getc()
    {
        return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;
    }
    inline ll read()
    {
        RE ll x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    inline ll READ(ll p)
    {
        RE ll x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10%p+ch-'0';ch=getchar();}
        return x*f;
    }
    const ll MAXN=1000010,maxn=20000010;
    char a[20],c[110];
    ll n,cnt,maxx,top;int an[MAXN];
    struct wy
    {
        ll x,y;
        ll friend operator <(wy a,wy b){return a.x<b.x;}
    }t[MAXN];
    map<ll,ll>H;
    ll p[MAXN],v[MAXN],mu[MAXN];
    ll c1[MAXN],ans1[MAXN];
    int vis[maxn],pos[maxn];
    inline void prepare()
    {
    	rep(2,maxx,i)
    	{
    		if(!v[i])p[++top]=v[i]=i,mu[i]=-1;
    		rep(1,top,j)
    		{
    			if(maxx/i<p[j])break;
    			v[i*p[j]]=p[j];
    			if(v[i]==p[j])break;
    			mu[i*p[j]]=-mu[i];
    		}
    	}
    }
    inline ll ksm(ll b,ll p,ll M)
    {
        ll cnt=1;
        while(p)
        {
            if(p&1)cnt=cnt*b%M;
            b=b*b%M;p=p>>1;
        }
        return cnt;
    }
    inline ll ksc(ll x,ll y,ll p)
    {
    	ull z=(ld)x/p*y;
    	ull res=(ull)x*y-(ull)z*p;
    	return (res+p)%p;
    }
    inline ll Ksm(ull b,ll p,ll M)
    {
        ull cnt=1;
        while(p)
        {
            if(p&1)cnt=ksc(b,cnt,M);
            b=ksc(b,b,M);p=p>>1;
        }
        return cnt;
    }
    inline ll wa_K(ui b,ll p)
    {
    	ui cnt=1;
    	while(p)
    	{
    		if(p&1)cnt=cnt*b;
    		b=b*b;p=p>>1;
    	}
    	return (ll)cnt%mod;
    }
    inline ll pd(ll x,ll b)
    {
    	ll d=x-1,p=0;
    	while((d&1)==0)d=d>>1,++p;
    	ll w=Ksm(b,d,x);
    	if(w==1)return 1;
    	rep(0,p,i)
    	{
    		if(w==x-1)return 1;
    		w=ksc(w,w,x);
    	}
    	return 0;
    }
    inline ll judge(ll x)
    {
    	if(x==2||x==3||x==7||x==61||x==24251)return 1;
    	if(x==46856248255981ll||x<2||!(x&1)||(x%3==0))return 0;
    	return pd(x,2)&&pd(x,3);
    }
    inline void prepare1(int x)
    {
    	top=0;
    	for(int i=1;p[i]*p[i]<=x;++i)
    		if(x%p[i]==0)c1[++top]=p[i];
    	if(x>1)c1[++top]=x;
    }
    inline ll judge1(ll x,ll M)
    {
    	rep(1,top,i)if(ksm(x,(M-1)/c1[i],M)==1)return 0;
    	return 1;
    }
    signed main()
    {
        freopen("1.in","r",stdin);
        //freopen("1.out","w",stdout);
        scanf("%s",a+1);
        if(a[1]=='1'&&a[2]=='_'&&a[3]=='9')
        {
            get(n);
            rep(1,n,i)
            {
                ll x=READ(mod-1);
                putl(ksm(19,x,mod));
            }
        }
        if(a[1]=='1'&&a[2]=='?'&&a[3]!='+')
        {
            get(n);
            /*read();read();read();
            scanf("%s",c+1);
            ll len=strlen(c+1);
            for(ll i=500000;;++i)
            {
                ll ans=0;
                rep(1,len,j)
                {
                    ans=(ans*10+c[j]-'0')%(i-1);
                }
                if(ksm(19,ans,i)==642666){putl(i);return 0;}//i==1145141
            }*/
            rep(1,n,i)
            {
                ll x=READ(1145141-1);
                putl(ksm(19,x,1145141));
            }
        }
        if(a[1]=='1'&&a[2]=='?'&&a[3]=='+')
        {
            get(n);
            /*rep(1,n,i)get(t[i].x);
            rep(1,n,i)get(t[i].y);
            sort(t+1,t+n+1);
            ll L,R,minn=INF;
            rep(1,n,i)
            {
                if(i<=10)continue;
                if(t[i].x-t[i-1].x<minn)L=i,R=i-1,minn=t[i].x-t[i-1].x;
            }
            putl(L);putl(R);
            cout<<t[L].x<<' '<<t[L].y<<endl;
            cout<<t[R].x<<' '<<t[R].y<<endl;
            cout<<(long double)t[R].y*19*19-t[L].y<<endl;
            long double w=(long double)t[R].y*19*19-t[L].y;
            //枚举因数 可以得到mod=5211600617818708273;*/
            rep(1,n,i)
            {
                ll x=read();
                putl(Ksm(19,x,5211600617818708273ll));
            }
        }
    	if(a[1]=='1'&&a[2]=='w'&&a[3]=='a')
    	{
    		/*cout<<2147483647+2<<endl;
    		ui A=2147483647;
    		ui B=2;
    		cout<<(ll)(A+B)<<endl;*/
    		get(n);
    		int w=1;
    		ll S,C;
    		for(ll i=1;;++i)
    		{
    			w=w*19%mod;
    			if(H[w])
    			{
    				//cout<<w<<' '<<cnt-H[w]<<' '<<H[w]<<endl;
    				S=H[w];C=i-H[w];
    				break;
    			}
    			H[w]=i;
    		}
    		//cout<<S<<' '<<C<<endl;
    		an[0]=1;
    		rep(1,S+C,i)an[i]=an[i-1]*19%mod;
    		rep(1,n,i)
    		{
    			ll x;get(x);
    			if(x<=S)put(an[x]);
    			else 
    			{
    				x=x-S;x=x%C;
    				put(an[S+x]);
    			}
    		}
    	}
    	if(a[1]=='2'&&a[2]=='p')
    	{
    		get(n);
    		rep(1,n,j)
    		{
    			ll L,R;
    			get(L);get(R);
    			for(ll i=L;i<=R;++i)
    			if(judge(i))putchar('p');else putchar('.');
    			puts("");
    		}
    	}
    	if(a[1]=='2'&&a[2]=='u')
    	{
    		maxx=1000010;
    		prepare();
    		get(n);
    		rep(1,n,k)
    		{
    			ll L,R;
    			get(L);get(R);
    			if(R<=1000000)
    				rep(L,R,i)putchar(mu[i]?(mu[i]==-1?'-':'+'):'0');
    			else
    			{
    				rep(L,R,i)c1[i-L+1]=i,ans1[i-L+1]=1;
    				rep(1,top,j)
    				{
    					ll st=(L%p[j]==0?L:(L/p[j]*p[j]+p[j]));
    					for(ll i=st;i<=R;i+=p[j])
    					{
    						int cnt=0;
    						while(c1[i-L+1]%p[j]==0)c1[i-L+1]/=p[j],++cnt,ans1[i-L+1]=-ans1[i-L+1];
    						if(cnt>=2)ans1[i-L+1]=0;
    					}
    				}
    				rep(L,R,i)
    				{
    					if(!ans1[i-L+1]){putchar('0');continue;}
    					if(c1[i-L+1]==1)putchar(ans1[i-L+1]==-1?'-':'+');
    					else
    					{
    						int w=judge(c1[i-L+1]);
    						if(w)ans1[i-L+1]=-ans1[i-L+1];
    						else 
    						{
    							ll ww=(int)sqrt(1.0*c1[i-L+1]);
    							if(ww*ww==c1[i-L+1])ans1[i-L+1]=0;
    						}
    						putchar(ans1[i-L+1]?(ans1[i-L+1]==-1?'-':'+'):'0');
    					}
    				}
    			}
    			puts("");
    		}
    	}
    	if(a[1]=='2'&&a[2]=='g'&&a[3]!='?')
    	{
    		get(n);maxx=1000000;prepare();
    		rep(1,n,k)
    		{
    			ll L,R,M;
    			get(L);get(R);get(M);
    			if(M==998244353)
    			{
    				prepare1(M-1);
    				rep(L,R,i)if(judge1(i,M))putchar('g');
    				else putchar('.');
    			}
    			else
    			{
    				prepare1(M-1);
    				ll ww=1,cc=1;
    				while(!judge1(ww,M))++ww;cc=ww;
    				rep(1,M-1,i)pos[ww]=i,ww=ww*cc%M;
    				rep(1,top,i)for(int j=c1[i];j<M;j+=c1[i])vis[j]=M;
    				rep(L,R,i)putchar(vis[pos[i]]!=M?'g':'.');
    			}
    			puts("");
    		}
    	}
    	if(a[1]=='2'&&a[2]=='g'&&a[3]=='?')
    	{
    		ll L,R,M;maxx=1000000;prepare();
    		/*get(L);maxx=1000000;prepare();
    		rep(1,50,i)ans1[i]=L+i-1;
    		scanf("%s",c+1);
    		int len=strlen(c+1);
    		for(ll i=1500000000;i<=2000000000;++i)
    		{
    			int flag=0;
    			if(!judge(i))continue;
    			prepare1(i-1);
    			rep(1,len,j)
    			{
    				int ww=c[j]=='g'?1:0;
    				if(judge1(ans1[j],i)!=ww){flag=1;break;}
    			}
    			if(!flag){put(i);return 0;}
    		}*/
    		get(n);
    		rep(1,2,i)
    		{
    			get(L);get(R);get(M);
    			prepare1(M-1);
    			rep(L,R,i)if(judge1(i,M))putchar('g');
    			else putchar('.');
    			puts("");
    		}
    		get(L);get(R);M=1515343657;
    		prepare1(M-1);
    		rep(L,R,i)if(judge1(i,M))putchar('g');
    		else putchar('.');
    	}
        return 0;
    }
    

    写了很长时间 除了第15个点第10个点 第7个点 第5个点有点困难 剩下的点还是可以写的。

    RM 写的常数要小一点 不要用过多数来判。

  • 相关阅读:
    【NOIP2013提高组T3】货车运输-最大生成树+倍增LCA
    【POJ1986】Distance Queries-LCA算法
    【POJ1986】Distance Queries-LCA算法
    【HDU2874】Connections between cities-LCA算法
    【HDU2874】Connections between cities-LCA算法
    【HDU2586】How far away?-LCA算法模板题
    js ajax调用请求
    js ajax调用请求
    ThinkPHP 3.1.2 视图 2
    ThinkPHP 3.1.2 视图 2
  • 原文地址:https://www.cnblogs.com/chdy/p/12527445.html
Copyright © 2011-2022 走看看