输入包含多组数据。
第一行包含两个正整数T,K分别表示数据组数和询问类型(对于一个测试点内的所有数据,询问类型相同)。 以下行每行包含三个正整数y,z,p,描述一个询问。
快速幂,扩展欧几里得,bsgs三合一
注意不要爆int,用long long
这个题好像不忽略行尾控空格回车,注意不要格式错误
2017.6.9 更改bsgs代码为减法版y^(i*m-j)=z(mod p)
#include<cmath> #include<ctime> #include<cstdio> #include<cstring> #include<cstdlib> #include<complex> #include<iostream> #include<algorithm> #include<iomanip> #include<vector> #include<string> #include<queue> #include<set> #include<map> using namespace std; typedef long long ll; inline int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch<='9'&&ch>='0'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();} return x*f; } inline void write(long long x) { if(x==0){putchar('0');return;} int temp[30];temp[0]=0;if(x<0)putchar('-'),x=-x; while(x){temp[++temp[0]]=x;x/=10;} while(temp[0]){putchar(temp[temp[0]--]+'0');} } int opt,n; inline long long qpow(long long x,int y,int z) { long long ans=1; while(y) { if(y&1)ans=ans*x%z; x=x*x%z; y>>=1; } return ans; } void qm() { int x,y,z; for(int i=1;i<=n;i++) { x=read();y=read();z=read(); write(qpow(x,y,z));puts(""); } } int u,q; inline ll exgcd(ll a,ll b) { if(b==0){u=1;q=0;return a;} ll temp=exgcd(b,a%b); ll t=u;u=q;q=t-a/b*q; return temp; } void ko() { ll x,y,z; for(int i=1;i<=n;i++) { x=read();y=read();z=read();y%=z; int t=exgcd(x,z); if(y%t){puts("Orz, I cannot find x!");continue;} y/=t;x/=t;z/=t;u=u*y%z; while(u<0)u+=z; write(u);puts(""); } } map<int,int>mp; inline void bsgs(int y,int z,int p) { y%=p; if(!y&&!z){puts("1");return ;} if(!y){puts("Orz, I cannot find x!");return;} mp.clear();int m=ceil(sqrt(p));ll tmp=z%p; for(int i=1;i<=m;i++) {tmp=tmp*y%p;mp[tmp]=i;} tmp=qpow(y,m,p);ll ine=1; for(int i=1;i<=m;i++) { ine=ine*tmp%p; if(mp[ine]) { printf("%d\n",((i*m-mp[ine])%p+p)%p); return ; } } puts("Orz, I cannot find x!"); } void b() { ll x,y,z; for(int i=1;i<=n;i++) { x=read();y=read();z=read(); bsgs(x,y,z); } } int main() { int x,y,z; n=read();opt=read(); switch(opt) { case 1:qm();break; case 2:ko();break; case 3:b();break; } return 0; }