Beispiel #1
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;
}
Beispiel #2
0
int main()
{
	phi_table(maxn);
	scanf("%lld %d", &N, &K);
	if (K == 1 || K == 3)
	{
		inv = get_inv(2);
	}
	else if (K == 2)
	{
		inv = get_inv(6);
	}
	else if (K == 4)
	{
		inv = get_inv(30);
	}
	else if (K == 5)
	{
		inv = get_inv(12);
	}
	long long ans = 0;
	for (int i = 1, j = N; i <= j; ++i, j = N / i)
	{
		printf("%lld %lld\n", pow_mod(i, K), euler_phi(N / i));
		ans = (ans + pow_mod(i, K) * euler_phi(N / i) % mod) % mod;
		ans = (ans + (sum(j, K) - sum(N / (i + 1), K)) * euler_phi(i) % mod) % mod;
	}
	if (ans < 0)
	{
		ans += mod;
	}
	printf("%lld\n", ans);
	return 0;
}
Beispiel #3
0
int BSGS(int a, int b, int p) { 
    int m, v, e = 1, i;
    m = (int) sqrt(p + 0.5) + 1;//这里不加1会出错的!
    v = pow_mod(pow_mod(a, m, p), p - 2, p);
    map<int, int> x;
    x[1] = 0;
    for (i = 1; i < m; ++i){
        e = e * a % p;
        if (!x.count(e)) x[e] = i;
    }
    for (i = 0; i < m; ++i){
        if (x.count(b)) return i * m + x[b];
        b = b * v % p;
    }
    return -1; // No solution
}
Beispiel #4
0
 bool is_primitive(long long a,long long p){
     if(a>=p)return 0;
     assert(is_prime(p));
     vector<pll> d=factorG(p-1);
     for(auto i:d) if(pow_mod(a,(p-1)/i.x,p)==1)return 0;
     return 1;
 }
vector <int> residue(int p,int N,int a)
{
    int g=primitive_root(p);
    long long m=discrete_log(g,a,p);
    vector<int> ret;
    if (a==0)
    {
        ret.push_back(0);
        return ret;
    }
    if (m==-1) return ret;
    long long A=N,B=p-1,C=m,x,y;
    long long d=extended_gcd(A,B,x,y);
    if (c%d!=0) return ret;
    x=x*(C/d)%B;
    long long delta=B/d;
    for (int i=0;i<d;i++)
    {
        x=((x+delta)%B+B)%B;
        ret.push_back((int)pow_mod(g,x,p));
    }
    sort(ret.begin(),ret.end());
    ret.erase(unqinue(ret.begin(),ret.end()),ret.end());
    return ret;
}
Beispiel #6
0
int main(){
        FILE *ff,*fi; 
    LL ttt,res;
    
    freopen("data.in","r",stdin);
    fi = fopen("data.out","r");
    ff = fopen("forcedata_0.out","w");
    while(scanf("%d%d%d",&n,&m,&k)!=EOF){
        memset(g,0,sizeof(g));
        //if(n>8000)break;
        for(i=0;i<m;i++){
            scanf("%d%d%",&ti,&tj);   
            //printf("%d %d\n",n,tj); 
            add(ti,tj);
        }
        result = 0;
        for(i=0;i<n;i++)
            for(j=0;j<n;j++){
                if(!g[i][j]){
                    result++;
                    add(i,j);
                }
            }
        //printf("%I64d\n",result);
        fscanf(fi,"%I64d",&ttt);
        result = pow_mod(k,result,MM);
        printf("%I64d %s\n",result,ttt==result?"ok":"!!!!!!!!!!!!!!!!!!!!!!");
        if(ttt!=result)scanf(" ");
        fprintf(ff,"%I64d\n",result);
    }
    scanf(" ");
}
Beispiel #7
0
int main() {
    memset(prime, 0, sizeof(prime));
    P();
    while (scanf("%d", &n) && n) {
        int flag = judge(n); 
        if (flag) {
            printf("%d is normal.\n", n); 
            continue;
        }
        else {
            int flag1 = 1;
            for (int i = 2; i < n; i++) {
                int k = pow_mod(i, n, n);  
                if (k != i) {
                    flag1 = 0; 
                    break; 
                }
            } 
            if (flag1)
                printf("The number %d is a Carmichael number.\n", n);
            else
                printf("%d is normal.\n", n);
        } 
    }
    return 0;
} 
long long pow_mod(int n, int k, int m) {
  if(!k) return 1;
  long long p = pow_mod(n, k/2, m);
  p = p * p % m;
  if(k&1) p = p * n % m;
  return p;
}
Beispiel #9
0
int solve (int d, int M) {
	if (d == k - 1)
		return A[d]%M;

	int phi = euler_phi(M);
		int c = solve (d+1, phi) + phi;
	return pow_mod(A[d], c, M);
}
Beispiel #10
0
int main()
{
	int m, n, t;
	scanf("%d %d %d", &m, &n, &t);
	for (int i = 0; i <= t; ++i)
	{
		C[i][0] = 1;
		for (int j = 1; j < i; ++j)
			C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % mod;
		C[i][i] = 1;
	}
	int ans = 0;
	for (int i = 0; i <= t; ++i)
		ans = (ans + pow_mod(m - 2 * i, n) * C[t][i]) % mod;
	printf("%d\n", (ans * pow_mod(inv2, t) % mod + mod) % mod);
	return 0;
}
Beispiel #11
0
LL pow_mod(int a, int n, int m) {
    if (n == 1) 
        return a % m;
    LL x = pow_mod(a, n / 2, m);
    LL ans = (x * x) % m;
    if (n % 2 == 1)
        ans = ans * a % m;
    return ans; 
}
Beispiel #12
0
/*
 *素性测试,Miller_Rabin 测试算法
 *if n < 3,215,031,751, just test a = 2, 3, 5, and 7;
 *if n < 4,759,123,141, just test a = 2, 7, and 61;
 *if n < 1,122,004,669,633, just test a = 2, 13, 23, and 1662803;
 *if n < 2,152,302,898,747, just test a = 2, 3, 5, 7, and 11;
 *if n < 3,474,749,660,383, just test a = 2, 3, 5, 7, 11, and 13;
 *if n < 341,550,071,728,321, just test a = 2, 3, 5, 7, 11, 13, and 17.
 *if n < 3,825,123,056,546,413,051, just test a = 2, 3, 5, 7, 11, 13, 17, 19, and 23.
 *if n < 18,446,744,073,709,551,616 = 2^64, just test a = 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, and 37.
 */
bool test(ll x, ll n) {
    ll m = n - 1;
    while (!(m&1)) m >>= 1;
    x = pow_mod(x, m, n);
    for (; m<n-1 && x!=1 && x!=n-1; m<<=1) {
        x = mul_mod(x, x, n);  //防爆long long
    }
    return x == n-1 || (m&1) == 1;
}
// Public library function. Returns NULL if successful, a string starting with "I/O error: "
// if an I/O error occurred (please see perror()), or a string if some other error occurred.
const char *modify_file_crc32(const char *path, uint64_t offset, uint32_t newcrc, bool printstatus) {
	FILE *f = fopen(path, "r+b");
	if (f == NULL)
		return "I/O error: fopen";
	
	// Read entire file and calculate original CRC-32 value.
	// Note: We can't use fseek(f, 0, SEEK_END) + ftell(f) to determine the length of the file, due to undefined behavior.
	// To be portable, we also avoid using POSIX fseeko()+ftello() or Windows GetFileSizeEx()/_filelength().
	uint64_t length;
	uint32_t crc = get_crc32_and_length(f, &length);
	if (offset > UINT64_MAX - 4 || offset + 4 > length) {
		fclose(f);
		return "Error: Byte offset plus 4 exceeds file length";
	}
	if (printstatus)
		fprintf(stdout, "Original CRC-32: %08" PRIX32 "\n", reverse_bits(crc));
	
	// Compute the change to make
	uint32_t delta = crc ^ newcrc;
	delta = (uint32_t)multiply_mod(reciprocal_mod(pow_mod(2, (length - offset) * 8)), delta);
	
	// Patch 4 bytes in the file
	fseek64(f, offset);
	for (int i = 0; i < 4; i++) {
		int b = fgetc(f);
		if (b == EOF) {
			fclose(f);
			return "I/O error: fgetc";
		}
		b ^= (int)((reverse_bits(delta) >> (i * 8)) & 0xFF);
		if (fseek(f, -1, SEEK_CUR) != 0) {
			fclose(f);
			return "I/O error: fseek";
		}
		if (fputc(b, f) == EOF) {
			fclose(f);
			return "I/O error: fputc";
		}
		if (fflush(f) == EOF) {
			fclose(f);
			return "I/O error: fflush";
		}
	}
	if (printstatus)
		fprintf(stdout, "Computed and wrote patch\n");
	
	// Recheck entire file
	bool match = get_crc32_and_length(f, &length) == newcrc;
	fclose(f);
	if (match) {
		if (printstatus)
			fprintf(stdout, "New CRC-32 successfully verified\n");
		return NULL;  // Success
	} else
		return "Assertion error: Failed to update CRC-32 to desired value";
}
Beispiel #14
0
vector<int> multiply(vector<int> u, vector<int> v) { // the same as the complex version
	nth_root.clear();
	int r = pow_mod(ROOT, (MOD - 1) / n, MOD);
	for (int i = 0, tmp = 1; i < n; ++i) {
		nth_root.push_back(tmp);
		tmp = (long long)tmp * r % MOD;
	}
	int inv = inverse(n, MOD);
	return ret;
}
int main() {
  int T, n, k, m, a;
  scanf("%d", &T);
  for(int i = 1; i <= T; i++) {
    scanf("%d", &n);
    long long ans = pow_mod(2,n-1,MOD) * n % MOD;
    printf("Case #%d: %d\n", i, (int)ans);
  }
  return 0;
}
//以a为基,n-1=x*2^t      a^(n-1)=1(mod n)  验证n是不是合数
//一定是合数返回true,不一定返回false
bool check(long long a,long long n,long long x,long long t){
    long long ret=pow_mod(a,x,n);
    long long last=ret;
    for(int i=1;i<=t;i++){
        ret=mult_mod(ret,ret,n);
        if(ret==1&&last!=1&&last!=n-1) return true;//合数
        last=ret;
    }
    if(ret!=1) return true;
    return false;
}
Beispiel #17
0
int main()
{
    int t,n;
    while(scanf("%d",&t)!=EOF)
        while(t--)
        {
            scanf("%d",&n);
            printf("%lld\n",pow_mod(2,n-1,mod)-1);
        }
    return 0;
}
Beispiel #18
0
void fermat_test(const int n, int* p, int* np) {
    *p = *np = 0;
    int a;
#pragma omp parallel for private(a)
    for ( a=2; a < n; a++) {
        if ( pow_mod(a, n, n) == a)
            *p += 1;
        else
            *np +=1;
    }

}
Beispiel #19
0
bool test(int n, int a, int d) {
	if (n == 2) return true;
	if (n == a) return true;
	if ((n & 1) == 0) return false;
	while (!(d & 1)) d = d >> 1;
	int t = pow_mod(a, d, n);
	while ((d != n - 1) && (t != 1) && (t != n - 1)) {
		t = (long long)t * t % n;
		d = d << 1;
	}
	return (t == n - 1 || (d & 1) == 1);
}
// Solve the congruence x^2 = n (mod p).
void tonelli_shanks(uint32_t n, uint32_t p, uint32_t *result) {
	if(p == 2) {
		result[0] = n;
		result[1] = n;
		return;
	}

	uint64_t S = 0;
	uint64_t Q = p - 1;

	while(Q % 2 == 0) {
		Q /= 2;
		++S;
	}

	uint64_t z = 2;

	while(legendre_symbol(z, p) != -1)
		++z;

	uint64_t c = pow_mod(z, Q, p);
	uint64_t R = pow_mod(n, (Q + 1) / 2, p);
	uint64_t t = pow_mod(n, Q, p);
	uint64_t M = S;

	while(t % p != 1) {
		int32_t i = 1;
		while(pow_mod(t, pow(2, i), p) != 1)
			++i;
	
		uint64_t b = pow_mod(c,  pow(2, M - i - 1), p);
		R = R * b % p;
		t = t * b * b % p;
		c = b * b % p;
		M = i;
	}

	result[0] = R;
	result[1] = p - R;
}
Beispiel #21
0
int modsqr(int a,int b=n)
{
	int b,k,i,x;
	if(n==2)return a%n;
	if(pow_mod(a,(n-1)/2,n)==1)
	{
		if(n%4==3)
		{
			x=pow_mod(a,(n+1)/4,n);
		}
		else
		{
			for(b=1;pow_mod(b,(n-1)/2,n)==1;b++);
			i=(n-1)/2;
			k=0;
			do
			{
				i/=2;k/=2;
				if((pow_mod(a,i,n)*(long long)pow(b,k,n)+1)%n==0)
					k+=(n-1)/2;
			}while(i%2=0);
			x=(pow_mod(a,(i+1)/2,n)*(long long)pow_mod(b,k/2,n))%n;
		}
		if(x*2>n)
		{
			x=n-x;
		}
		return x;
	}
	return -1;
}
Beispiel #22
0
int main()
{
	scanf("%s", s);
	scanf("%s", t);
	int n = strlen(s);
	int k;
	scanf("%d", &k);
	long long cnt = (pow_mod(n - 1, k) + (k & 1 ? 1 : -1)) * pow_mod(n, mod - 2) % mod;
	long long cnt0 = cnt - (k & 1 ? 1 : -1);
	long long ans = 0;
	for (int i = 0; i < n; ++i)
	{
		bool flag = true;
		for (int j = 0; j < n; ++j)
			if (s[j] != t[(j + i) % n])
				flag = false;
		if (flag)
			ans = (ans + (i == 0 ? cnt0 : cnt)) % mod;
	}
	printf("%I64d\n", (ans + mod) % mod);
	return 0;
}
Beispiel #23
0
int rsa_sign(unsigned char** result, unsigned char* hash, unsigned int hashLengthBytes, unsigned char* privateKey, unsigned char* modulus, unsigned int keyLengthBytes){
	
	if(hashLengthBytes>(keyLengthBytes-11)){
		return 0;
	}

	unsigned char* padded=new unsigned char[keyLengthBytes];
	add_PKCS1_padding(padded,hash,hashLengthBytes,false,keyLengthBytes);

	int r=pow_mod(result,padded,privateKey,modulus,keyLengthBytes);

	return r;
}
Beispiel #24
0
bool solve(int n)
{
	for (int i = 0; i <= 23; ++i)
	{
		int s = 1 << i;
		if (i != 23 && pow_mod(n, s * 3 * 5 * 7) == 1) return false;
		if (pow_mod(n, s * 3 * 5 * 1) == 1) return false;
		if (pow_mod(n, s * 3 * 1 * 7) == 1) return false;
		if (pow_mod(n, s * 3 * 1 * 1) == 1) return false;
		if (pow_mod(n, s * 1 * 5 * 7) == 1) return false;
		if (pow_mod(n, s * 1 * 5 * 1) == 1) return false;
		if (pow_mod(n, s * 1 * 1 * 7) == 1) return false;
		if (pow_mod(n, s * 1 * 1 * 1) == 1) return false;
	}
	return true;
}
Beispiel #25
0
inline int calc(int a, int p) {
	if (a < 2)
		return a;
	if (!quad_resi(a, p))
		return p;			// no solution
	if (p % 4 == 3)
		return pow_mod(a, (p + 1) / 4, p);
	int b = 0;
	while (quad_resi((my_sqr(b) - a + p) % p, p))
		b = rand() % p;
	quad_poly ret = quad_poly(b, 1, (my_sqr(b) - a + p) % p, p);
	ret = ret.pow((p + 1) / 2);
	return ret.zero;
}
Beispiel #26
0
bool witness(LL a, LL n, LL x, LL t) //以a为基,n-1=x*2^t,检验n是不是合数
{
    LL ret = pow_mod(a, x, n);
    LL last = ret;
    for (int i = 1; i <= t; i++)
    {
        ret = muti_mod(ret, ret, n);
        if (ret == 1 && last != 1 && last != n - 1) 
            return 1;
        last = ret;
    }
    if (ret != 1) return 1;
    return 0;
}
bool test(long long n, long long a, long long d)
{
    if (n == 2) return true;
    if (n == a) return true;
    if ((n & 1) == 0) return false;
    while(!(d & 1)) d = d >> 1;
    long long t = pow_mod(a, d, n);
    while((d != n - 1) && (t != 1) && (t != n - 1))
    {
        t = t * t % n;
        d = d << 1;
    }
    return (t == n - 1 || (d & 1) == 1);
}
Beispiel #28
0
bool check(LL a, LL n, LL x, LL t)
{   //以a为基,n-1=x*2^t,检验n是不是合数
    LL ret = pow_mod(a, x, n), last = ret;
    for (int i = 1; i <= t; i++)
    {
        ret = multi_mod(ret, ret, n);
        if (ret == 1 && last != 1 && last != n - 1)
            return 1;
        last = ret;
    }
    if (ret != 1)
        return 1;
    return 0;
}
bool Wintess(int64 aa, int64 n, int64 mod)      /*是以aa为底的伪质数返回0,是合数返回1*/
{
    int t = 0;
    while ((n & 1) == 0){               /*n = d * 2^t; n = d;*/
        n >>= 1;
        ++ t;
    }

    int64 x = pow_mod(aa, n, mod), y;
    while (t --){
        y = mul_mod (x, x, mod);
        if (y == 1 && x != 1 && x != mod-1) return 1;
        x = y;
    }
    return (y != 1);
}
Beispiel #30
0
// get a^p mod n
int pow_mod(int a, int n, int p){
    if (p == 1) {
        return a;
    }
    int half_p = p/2;
    int q = p%2;
    int t;
//#pragma omp task shared(t)
    t = pow_mod(a, n, half_p);
    int r = (t*t) %n;
//#pragma omp taskwait
    if (q==0)
        return r;
    else 
        return ((r*a)%n);
}