Welcome to Lewisak 's blog .|

LEWISAK

园龄:10个月粉丝:13关注:10

poj3696 The Luckiest number 题解

很容易想到,n个8可以转换为(10n+11)/98

容易你个集贸啊,xzz推10分钟我推了一个上午

顺便膜拜xzz

然后就是推式子了。。。(悲

(10n+11)/980(modh)=>10n+18890(modh)=>10n+1880(mod9h)=>10n+188(mod9h)=>10n+11(mod9hgcd(8,h))

PS:推到最后一步时我认为要拿while处理,xzz告诉我有个东西叫gcd,我惊讶极了

然后就可以欧拉定理了

PS*2:欧拉定理和万恶的高斯消元一样,只能求出特解,要枚举解的因子

最后贴上丑陋的代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int cnt,n;
int phi_(int x){
	double ans=x;
	for(int i=2;i<=sqrt(x);i++){
		if(x%i==0){
			ans=ans*(i-1)/i;
		}
		while(x%i==0){
			x/=i;
		}
	}
	if(x!=1){
		ans=ans*(x-1)/x;
	}
	return ans;
}
int qpow(int a,int b,int mod){
	int ans=1;
	while(b){
		if(b&1){
			ans=(ans%mod*a%mod+mod)%mod;
		}
		a=(a%mod*a%mod+mod)%mod;
		b>>=1;
	}
	return ans%mod;
}
signed main(){
	while(cin>>n&&n){
		n*=9;
		n=n/(__gcd((long long)8,n));
		if(__gcd(n,(long long)10)>1){
			cout<<"Case "<<++cnt<<":"<<0<<endl;
			continue;
		}
		int phi=phi_(n),minn=1e9;
		for(int i=1;i*i<=phi;i++){
			if(phi%i){
				continue;
			}
			if(qpow(10,i,n)==1){
				minn=min(i,minn);
			}
			if(qpow(10,phi/i,n)==1){
				minn=min(phi/i,minn);
			}
		}
		cout<<"Case "<<++cnt<<":"<<minn<<endl;
	}
	return 0;
}

poj3696 The Luckiest number

本文作者:lewisak

本文链接:https://www.cnblogs.com/lewisak/p/18146983

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   LEWISAK  阅读(11)  评论(0编辑  收藏  举报
/
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起