zoj 2674 Strange Limit 歐拉定理應用 (3-E)

來源:互聯網
上載者:User

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 Name2130779 2010-03-28 22:49:39 Accepted 2674 C++ 0 176 watashi@Zodiac*/

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.