zoj 2674 Strange Limit 欧拉定理应用 (3-E)

1 a,m和不一定互素的时候,欧拉定理的应用  a^phi(m)%m=a^(k*phi(m) ) %m    (证明用到中国剩余定理)

2 发现A 满足的同余式以后 ,由于phi(m)<m  ,可以设计一个递归函数搞定之

#include<iostream>
#include<vector>
#include<set>
using namespace std;
typedef long long inta;

int p[3000];

vector<int>  v;

void make_prime()
{
   for(int i=2;i<3000;i++)
     p[i]=0;

   for(int i=2;i<3000;i++)
     {
        if(p[i]==0)
        for(int j=i*i;j<3000;j+=i)
            p[j]=1;
     }

    for(int i=2;i<3000;i++)
       if(p[i]==0)
          v.push_back(i);
}


inta quick_mod(inta a,inta b,inta m )
{
    inta ans=1;

    while(b)
    {
       if(b&1)
       {
         ans=(ans*a)%m;
         b--;
       }
       b/=2;
       a=a*a%m;

    }

    return ans;

}




inta fy(inta n)
{

   inta ans=n;

   set<int>  s;
   for(int i=0;i<v.size();i++)
     if(n%v[i]==0)
     {
        if(s.find(v[i])==s.end())
        {s.insert(v[i]);
         ans/=v[i];
         ans*=(v[i]-1);

        }
       n/=v[i];
       i--;
     }

     return ans;

}

inta ans(inta a,inta m)
{
    if(m==1)
        return 0;
    else
    {
        inta temp=fy(m);
        return quick_mod(a,temp,m)*quick_mod(a,ans(a,temp),m);
    }
}
int main()

{

    make_prime();


   int tag=0;
   int p,m;

int *fac=new int [13];
   fac[0]=1;
   fac[1]=1;
   fac[2]=2;
   fac[3]=6;
   fac[4]=24;
   fac[5]=120;
   fac[6]=720;
   fac[7]=5040;
   fac[8]=40320;
   fac[9]=362880;
   fac[10]=3628800;
   fac[11]=39916800;
   fac[12]=479001600;

 while(cin>>p>>m)
 {   if(tag==1) cout<<endl;
     if(tag==0) tag=1;
       m=fac[m];
       cout<<ans(p,m)%m<<endl;
 }
}



这里求phi(m)的方式还是有点土

watashi大神的代码如下:


#include <cstdio>

long long f[] = {1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800, 39916800, 479001600};
long long p[] = {2, 3, 5, 7, 11, 13};

long long gcd(long long a, long long b) {
	return b == 0 ? a : gcd(b, a % b);
}

long long phi(long long n) {
	long long m = 1;
	for (int i = 0; n > 1; ++i) {
		if (n % p[i] == 0) {
			m *= p[i] - 1;
			n /= p[i];
			while (n % p[i] == 0) {
				m *= p[i];
				n /= p[i];
			}
		}
	}
	return m;
}

long long powMod(long long a, long long b, long long m) {
	long long c = 1 % m;
	while (b > 0) {
		if ((b & 1) != 0) {
			c = c * a % m;
		}
		a = a * a % m;
		b >>= 1;
	}
	return c;
}

long long gao(long long a, long long b) {
	if (b == 1) {
		return 0;
	} else {
		long long d = phi(b);
		return powMod(a, d + gao(a, d), b);
	}
}

int main() {
	bool blank = false;
	long long a, b;
	
	while (scanf("%lld%lld", &a, &b) != EOF) {
		if (blank) {
			puts("");
		} else {
			blank = true;
		}
		printf("%lld\n", gao(a, f[b]));
	}

	return 0;
}

/*
Run ID  	Submit Time  	Judge Status  	Problem ID  	Language  	Run Time(ms)  	Run Memory(KB)  	User Name
2130779 	2010-03-28 22:49:39 	Accepted 	2674 	C++ 	0 	176 	watashi@Zodiac
*/



 

posted on 2013-07-22 03:08  814jingqi的ACM  阅读(115)  评论(0编辑  收藏  举报