标签:return gcd int res 定理 qmul 幸运 欧拉 mod
Code:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
#define int long long
const int N = 1e5 + 10, M = 1e5;
int c;
int qmul(int a,int p,int mod){
int res=0;
while(p){
if(p&1)res=(res+a)%mod;
a=(a+a)%mod;
p>>=1;
}
return res;
}//慢速乘,用于解决快速幂中的两个1e10相乘爆ll问题
int gcd(int a, int b) {
return b ? gcd(b, a%b) : a;
}
int qmi(int a, int p, int mod) {
int res = 1;
while (p) {
if (p & 1)res = qmul(res,a,mod)%mod;
a = qmul(a,a,mod)%mod;
p >>= 1;
}
return res;
}
bool check(int x) {
if (qmi(10, x, c) == 1)return 1;
return 0;
}
signed main()
{
int L;
int id = 0;
while (cin >> L, L) {
printf("Case %lld: ", ++id);
c = 9 * L / gcd(L, 8);
if (gcd(c, 10) != 1)cout << 0 << endl;
else {
int phi = c;
int tc = c;
for (int i = 2; i <= M; i++) {
int cnt = 0;
while (tc%i == 0) {
cnt++;
tc /= i;
}
if(cnt)phi = phi * (i - 1) / i;
}//求欧拉函数
if(tc!=1)phi = phi /tc *(tc-1);//先除后乘,不然又爆ll了...
int res = phi;
for (int i = 1; i*i<=phi; i++) {
if (phi%i == 0 ){
if(check(i))res=min(res,i);
if(check(phi/i))res=min(res,phi/i); //求约数
}
}
cout<<res<<endl;
}
}
}
有诸多的坑
标签:return,gcd,int,res,定理,qmul,幸运,欧拉,mod 来源: https://www.cnblogs.com/codjjj/p/15868924.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。