关于方程a^x=1(mod m)的最小x解
生活随笔
收集整理的這篇文章主要介紹了
关于方程a^x=1(mod m)的最小x解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
定理:
設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的最大公約數。
所以進一步有:,然后就是上面的那個定理了。
#include <iostream> #include <string.h> #include <algorithm> #include <stdio.h>using namespace std; typedef long long LL;LL dp[1000005];LL gcd(LL a,LL b) {return b? gcd(b,a%b):a; }LL phi(LL n) {LL rea=n,i;for(i=2;i*i<=n;i++){if(n%i==0){rea=rea-rea/i;while(n%i==0) n/=i;}}if(n>1)rea=rea-rea/n;return rea; }LL multi(LL a,LL b,LL m) {LL ans=0;while(b){if(b&1){ans=(ans+a)%m;b--;}b>>=1;a=(a+a)%m;}return ans; }LL quick_mod(LL a,LL b,LL m) {LL ans=1;a%=m;while(b){if(b&1){ans=multi(ans,a,m);b--;}b>>=1;a=multi(a,a,m);}return ans; }int main() {int k=1;LL L,i,m;while(cin>>L){if(L==0) break;printf("Case %d: ",k++);m=9*L/gcd(8,L);if(gcd(10,m)!=1){puts("0");continue;}LL ans=phi(m);LL size=0;for(i=1;i*i<=ans;i++){if(ans%i==0){dp[size++]=i;if(ans!=i*i) dp[size++]=ans/i;}}sort(dp,dp+size);for(i=0;i<size;i++)if(quick_mod(10,dp[i],m)==1) break;cout<<dp[i]<<endl;}return 0; }
總結
以上是生活随笔為你收集整理的关于方程a^x=1(mod m)的最小x解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: fibonacci数列的性质(ZOJ37
- 下一篇: 构造类斐波那契数列矩阵