• CH the luckiest number 欧拉函数 同余


    解法

    幸运数可以表示为(10^x-1)8/9,
    所以 L | (10^x-1)
    8/9,
    所以 L9/d | (10^x-1) (d=gcd(L,8));
    所以 1$equiv$10^x (mod L
    9/d)

    可以通过反证法证明 若a^x$equiv$1(mod n) 则 x是$varphi$的约数;

    所以只用从小到大枚举L*9/d的约数,用快速幂check即可。

    错误代码

    #include<bits/stdc++.h>
    #define i8 __int128
    using namespace std;
    typedef long long LL;
    
    LL L,phi,a[500000];
    
    LL gcd(LL a,LL b)
    {
    	if(b==0) return a;
    	return gcd(b,a%b);
    }
    
    LL Getphi(LL L)
    {
    	LL phi=L;
    	for(int i=2;i*i<=L;i++)
    	{
    		if(L%i==0)
    		{
    			phi=phi/i*(i-1);
    			while(L%i==0) L/=i;
    		}
    	}
    	if(L>1) phi=phi/L*(L-1);
    	return phi;
    }
    
    LL ksm(LL a,LL b,LL p)
    {
    	LL ans=1;
    	while(b)
    	{
    		if(b&1) ans=(i8)ans*a%p;
    		a=(i8)a*a%p;
    		b>>=1;
    	}
    	return ans;
    }
    
    int main()
    {
    	int k=0;
    	while(scanf("%lld",&L)==1 && L)
    	{
    		int op=0,m=0;
    		printf("Case %d:",++k);
    		
    		L=L*9/gcd(L,8); 
    		phi=Getphi(L);cout<<L<<" "<<phi<<endl;
    	
    		if(gcd(10,L)==1)
    		{	
    			for(int i=1;i*i<=phi;i++)
    			{
    				if(phi%i==0) a[++m]=i;
    				if(i*i!=phi) a[++m]=i;
    			}
    			sort(a+1,a+m+1);
    			for(int i=1;i<=m;i++)
    				if(ksm(10,a[i],L)==1)
    				{ printf("%lld
    ",a[i]); break; }			
    		}
    		else printf("0
    ");
    	}
    	return 0;
    }
    

    用__int128疯狂T和RE,不知道为什么。。
    正解用的都是些玄学乘法,什么long double,还有lyd在第一章介绍的。。。
    不想写了。

  • 相关阅读:
    泛型与非泛型
    C# 调用CMD,执行DOS命令
    数据库设计随笔(ZZ)
    关于三层开发(zz)
    三层架构学习(转)
    Node.js & child_process All In One
    HTML5 Canvas Tag Cloud All In One
    macOS & VSCode terminal show current git branch All In One
    飞书 excel 固定列 All In One
    git diff one of committed file All In One
  • 原文地址:https://www.cnblogs.com/lzqlalala/p/10547025.html
Copyright © 2020-2023  润新知