//a在模n乘法下的逆元,没有则返回-1 long long inv(long long a, long long n) { long long x, y; long long t = exgcd(a, n, x, y); if(t != 1) return -1; return (x%n+n)%n; }
int main() { int T, ca = 1; scanf("%d", &T); while(T--) { scanf("%d%d", &k, &ret); int m = (int)sqrt(1.0 * MOD) + 10; std::map<int, int> mp; for(int i = 0; i < m; i++) { int tmp = pow_mod(k, i); if(mp.find(tmp) == mp.end()) { mp[tmp] = i; } } int ans = MOD; for(int i = 0; i < m; i++) { int tmp = pow_mod(pow_mod(k, i), m); int x, y; exgcd(tmp, MOD, x, y); while(x < 0) x += MOD; x = 1LL * x * ret % MOD; y = 1LL * y * ret % MOD; if(mp.find(x) != mp.end()) { tmp = i * m + mp[x]; if(tmp < ans) { ans = tmp; } } } printf("Case %d: %d\n", ca++, ans); } return 0; }
long long inv(long long a) { long long x,y; long long t=exgcd(a,M,x,y); if(t!=1) return -1; return (x%M+M)%M; }
long long inverse(long long num, long long mod) { long long x, y; exgcd (num, mod, &x, &y); while (x < 0) x += mod, y -= num; return x; }
inline int exgcd(int a, int b, int &x, int &y) {//扩展Euclid if(!b) { x = 1; y = 0; return a; } int ret = exgcd(b, a%b, y, x); y -= a/b*x; return ret; }
static int64 inv(int64 x) { int64 a, b; exgcd(x, MOD, a, b); if (a < 0) a += MOD; return a; }
// X = r[i] (mod m[i]); 要求m[i]两两互质 // 引用返回通解X = re + k * mo; void crt(ll r[], ll m[], ll n, ll &re, ll &mo) { mo = 1, re = 0; for (int i = 0; i < n; i++) mo *= m[i]; for (int i = 0; i < n; i++) { ll x, y, d, tm = mo / m[i]; exgcd(tm, m[i], d, x, y); re = (re + tm * x * r[i]) % mo; } re = (re + mo) % mo; }
void exgcd(__int64 a,__int64 b,__int64 &d,__int64&x,__int64 &y) { if(!b) x=1,y=0,d=a; else { exgcd(b,a%b,d,y,x),y-=x*(a/b); } }
static void exgcd(int64 a, int64 b, int64 &x, int64 &y) { if (b == 0) { x = 1; y = 0; } else { int64 m, n; exgcd(b, a % b, m, n); x = n; y = m - (a / b) * n; } }
pair exgcd(long long int a, long long int b){ if (b == 0){ pair p = {1,0}; return p; } else { long long int r = a / b; long long int s = a % b; pair x = exgcd(b, s); pair p = {x.second, x.first - r * x.second}; return p; } }
long long exgcd(long long a, long long b, long long& x, long long &y) { if (b) { long long d = exgcd(b, a % b, y, x); y -= a / b * x; return d; } x = 1; y = 0; return a; }
int exgcd(int a, int b, int &x, int &y) { int gcd = a; if(b == 0) { x = 1; y = 0; } else { gcd = exgcd(b, a % b, x, y); x -= (a / b) * y; std::swap(x, y); } return gcd; }
LL china(int n,int *a,int *m){ LL M=1,d,x=0,y; for(int i=0;i<n;i++) M*=m[i]; for(int i=0;i<n;i++){ LL w=M/m[i]; d=exgcd(m[i],w,d,y); y=(y%M+M)%M; x=(x+y*w%M*a[i])%M; } while(x<0)x+=M; return x; }
long long exgcd(long long a,long long b,long long &x,long long &y) { if (b==0) { x=1; y=0; return a; } long long ans=exgcd(b,a%b,x,y); long long temp=x; x=y; y=temp-(a/b)*y; return ans; }
lld exgcd(lld a,lld b,lld &x,lld &y){ if (!b){ x=1; y=0; return a; } else{ lld res=exgcd(b,a%b,x,y); lld t=x; x=y; y=t-(a/b)*y; return res; } }
// 返回值为 a 和 b 的最大公约数 int exgcd(int a, int b, int &x, int &y) { if (b) // 1 { int r=exgcd(b,a%b,x,y); int t=x; x=y; y=t-a/b*y; return r; } else { x=1,y=0; return a; } }
int main() { __int64 n=0,m,a,b,c,d,x0,y0,lcm; int ca,i; scanf("%d",&ca); while(ca--) { scanf("%I64d",&m); bool flag=1; lcm=1; for(i=1;i<=m;i++) { scanf("%I64d",&aa[i]); lcm=lcm*aa[i]/gcd(lcm,aa[i]); } for(i=1;i<=m;i++) { scanf("%I64d",&rr[i]); } for(i=2;i<=m;i++) { a=aa[1],b=aa[i],c=rr[i]-rr[1]; exgcd(a,b,d,x0,y0); if(c%d) { flag=0; break; } __int64 t=b/d; x0=(x0*(c/d)%t+t)%t; rr[1]=aa[1]*x0+rr[1]; aa[1]=aa[1]*(aa[i]/d); } n++; printf("Case %I64d: ",n); if(!flag) { printf("-1\n"); continue; } __int64 ans=0; if(rr[1]!=0) { printf("%I64d\n",rr[1]); continue; } printf("%I64d\n",lcm); } }
// 如果有解则输出解并返回 true,否则返回 false bool mod_equation(int a, int b, int n) { int x,y; int d=exgcd(a,n,x,y); if (b%d != 0) return false; else { int e = x*(b/d) % n; for (int i=0; i<d; i++) cout<< (e + i*(n/d)) % n <<endl; return true; } }
lld solve(){ for (int i=1;i<=n;i++) if (c[i]>=m[i]){ check=false; return -1; } check=true; lld ans=c[1],LCM=m[1],x,y,g,mm; for (int i=2;i<=n;i++){ g=exgcd(LCM,m[i],x,y); if ((c[i]-ans)%g) {check=false; return -1;} ans=mod( ans + LCM * mod( (c[i]-ans)/g*x, m[i]/g ) , LCM/g*m[i]); LCM=LCM/g*m[i]; } return mod(ans,LCM); }
int main() { int a, b, x, y; printf("请输入第一个数: "); scanf("%d", &a); printf("请输入第二个数: "); scanf("%d", &b); //使用扩展欧几里德算法求最大公因数 //printf("%d 和 %d的最大公因数是: %d\n", a, b, gcd(a, b)); //使用扩展欧几里德算法计算a b的最大公因数 int maxComDivi = exgcd(a, b, &x, &y); printf("\n%d 和 %d的最大公因数是: %d\n", a, b, maxComDivi); printf("并且%d = %d * %d + %d * %d\n", maxComDivi, x, a, y, b); }
long long exgcd (long long a, long long b, long long *x, long long *y) { if (b == 0) { *x = 1; *y = 0; return a; } else { long long d = exgcd (b, a % b, x, y); long long t = *x; *x = *y; *y = t - a / b * (*y); return d; } }
int exgcd(int a, int b, int * x, int * y) { int r; //最大公因数 int temp; //暂时保存x if (b == 0) { *x = 1; *y = 0; return a; //a是最大公因数 } r = exgcd(b, a % b, x, y); //x,y是一个指针 //x1 = y2, y1 = x2 - (a / b) * y2 temp = *x; *x = *y; *y = temp - (a / b) * (*y); return r; //返回最大公因数 }
long long inv(long long a) { long long x, y; exgcd(a, mod, x, y); return (x % mod + mod) % mod; }
// 利用exgcd求a在模m下的逆元,需要保证gcd(a, m) == 1. ll inv(ll a, ll m) { ll x, y, d; exgcd(a, m, d, x, y); return d == 1 ? (x + m) % m : -1; }
ll exgcd(ll a,ll b){ if(!b)return x=1,y=0,a; ll d=exgcd(b,a%b),t=x; return x=y,y=t-a/b*y,d; }
ll rev(ll a,ll P){ exgcd(a,P); while(x<0)x+=P; return x%P; }
int modMultInv(int R, int M){ long long int ret = exgcd(R, M).first; if (ret < 0) ret = -(-ret % M) + M; return (int)(ret % 1000); }
return (modPower(n,e-1,mod) * n) % mod; } unsigned long long int modulo(long long int n, long long int mod){ while (n < 0) n += mod; return n % mod; } pair exgcd(ulli a, ulli b){ if (b == 0){ pair p = {.x = 1, .y = 0}; return p; } else { pair m = {.x = a/b, .y = a%b}; pair n = exgcd(b, m.y); pair r = {n.y, n.x - m.x * n.y}; return r; } } ulli modMultInverse(ulli n, ulli mod){ return modulo(exgcd(n,mod).x, mod); } int main(void){ scanf("%llu %llu %llu", &n, &e, &c); if (n % 2 == 0){ p = 2; q = n / 2;
int Inval(int a,int b,int n){ int x,y,e; exgcd(a,n,x,y); e=(ll)x*b%n; return e<0?e+n:e; }
int inverse(int x, int mod) { // multiplicative inverse int a = 0, b = 0; if (exgcd(x, mod, a, b) != 1) return -1; return (a % mod + mod) % mod; // C1: x & mod are co-prime return fpow(x, mod - 2, mod); // C2: mod is prime }