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 即可。
//#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\n",x)
#define gt(x) scanf("%d",&x)
#define put(x) printf("%d\n",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 F first
#define S second
#define mk make_pair
#define RE register
#define mod 998244353
#define ull unsigned long long
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=100010;
char a[20],c[110];
ll n;
struct wy
{
ll x,y;
ll friend operator <(wy a,wy b){return a.x<b.x;}
}t[MAXN];
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 ull gsc(ull a,ll b,ll M)
{
ull cnt=0;
while(b)
{
if(b&1)cnt=(cnt+a)%M;
a=(a+a)%M;b=b>>1;
}
return cnt;
}
inline ll Ksm(ull b,ll p,ll M)
{
ull cnt=1;
while(p)
{
if(p&1)cnt=gsc(b,cnt,M);
b=gsc(b,b,M);p=p>>1;
}
return cnt;
}
signed main()
{
freopen("1.in","r",stdin);
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));
}
}
return 0;
}
原文:https://www.cnblogs.com/chdy/p/12527445.html