示例#1
0
//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;
}
示例#2
0
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;
}
示例#4
0
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;
}
示例#5
0
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;
}
示例#6
0
文件: main.cpp 项目: riteme/test
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);
	}

}
示例#9
0
文件: main.cpp 项目: riteme/test
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;
    }
}
示例#10
0
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;
	}
}
示例#11
0
文件: 4.cpp 项目: holdzhu/ACM-Source
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;
}
示例#12
0
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;
}
示例#15
0
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;
    }
}
示例#16
0
// 返回值为 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);
	}
}
示例#18
0
// 如果有解则输出解并返回 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;
    }
}
示例#19
0
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);
}
示例#20
0
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);

}
示例#21
0
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;
    }
}
示例#22
0
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;     //返回最大公因数
}
示例#23
0
文件: 4.cpp 项目: holdzhu/ACM-Source
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;
}
示例#25
0
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;
}
示例#26
0
ll rev(ll a,ll P){
  exgcd(a,P);
  while(x<0)x+=P;
  return x%P;
}
示例#27
0
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);
}
示例#28
0
		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;
示例#29
0
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
}