现在的位置: 首页 > 综合 > 正文

关于方程a^x=1(mod m)的最小x解 关于方程a^x=1(mod m)的最小x解

2017年11月04日 ⁄ 综合 ⁄ 共 1941字 ⁄ 字号 评论关闭
 

关于方程a^x=1(mod m)的最小x解

分类: 数论 120人阅读 评论(0) 收藏 举报

定理:


设gcd(a,m)=1,必有正整数x,使得a^x=1(mod m),且设满足等式的最小正整数为x0,必满足x0|phi(m).注意m>1.

否则如果gcd(a,m)!=1,则方程a^x=1(mod m)没有解。


典型题目:HDU1395,HDU3307,POJ3696



前面两题很简单,下面我们来分析POJ3696.


题目:The Luckiest number


题意:求出由全8组成的数的最短长度,使得给定的L能整除它。


分析:先分析公式,可以发现一个全由A组成的数的表示形式为:,所以全8组成的数为:


L能整除它,则有:,亦即:,则应该先约去8与9L的最大公约数。

因为8与9互素,所以实际上就是约去8与L的最大公约数。


所以进一步有:,然后就是上面的那个定理了。


  1. #include <iostream>  
  2. #include <string.h>  
  3. #include <algorithm>  
  4. #include <stdio.h>  
  5.   
  6. using namespace std;  
  7. typedef long long LL;  
  8.   
  9. LL dp[1000005];  
  10.   
  11. LL gcd(LL a,LL b)  
  12. {  
  13.     return b? gcd(b,a%b):a;  
  14. }  
  15.   
  16. LL phi(LL n)  
  17. {  
  18.     LL rea=n,i;  
  19.     for(i=2;i*i<=n;i++)  
  20.     {  
  21.         if(n%i==0)  
  22.         {  
  23.             rea=rea-rea/i;  
  24.             while(n%i==0) n/=i;  
  25.         }  
  26.     }  
  27.     if(n>1)  
  28.         rea=rea-rea/n;  
  29.     return rea;  
  30. }  
  31.   
  32. LL multi(LL a,LL b,LL m)  
  33. {  
  34.     LL ans=0;  
  35.     while(b)  
  36.     {  
  37.         if(b&1)  
  38.         {  
  39.             ans=(ans+a)%m;  
  40.             b--;  
  41.         }  
  42.         b>>=1;  
  43.         a=(a+a)%m;  
  44.     }  
  45.     return ans;  
  46. }  
  47.   
  48. LL quick_mod(LL a,LL b,LL m)  
  49. {  
  50.     LL ans=1;  
  51.     a%=m;  
  52.     while(b)  
  53.     {  
  54.         if(b&1)  
  55.         {  
  56.             ans=multi(ans,a,m);  
  57.             b--;  
  58.         }  
  59.         b>>=1;  
  60.         a=multi(a,a,m);  
  61.     }  
  62.     return ans;  
  63. }  
  64.   
  65. int main()  
  66. {  
  67.     int k=1;  
  68.     LL L,i,m;  
  69.     while(cin>>L)  
  70.     {  
  71.         if(L==0) break;  
  72.         printf("Case %d: ",k++);  
  73.         m=9*L/gcd(8,L);  
  74.         if(gcd(10,m)!=1)  
  75.         {  
  76.             puts("0");  
  77.             continue;  
  78.         }  
  79.         LL ans=phi(m);  
  80.         LL size=0;  
  81.         for(i=1;i*i<=ans;i++)  
  82.         {  
  83.             if(ans%i==0)  
  84.             {  
  85.                 dp[size++]=i;  
  86.                 if(ans!=i*i) dp[size++]=ans/i;  
  87.             }  
  88.         }  
  89.         sort(dp,dp+size);  
  90.         for(i=0;i<size;i++)  
  91.             if(quick_mod(10,dp[i],m)==1) break;  
  92.         cout<<dp[i]<<endl;  
  93.     }  
  94.     return 0;  
  95. }  

抱歉!评论已关闭.