ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

最幸运的数字(欧拉定理,欧拉函数)

2022-02-07 19:32:52  阅读:161  来源: 互联网

标签:return gcd int res 定理 qmul 幸运 欧拉 mod


link

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. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有