其他分享
首页 > 其他分享> > C 幂幂数字

C 幂幂数字

作者:互联网

https://www.51nod.com/Contest/Problem.html#contestProblemId=4853

任意模数高次剩余是吧。

考虑题目就是找到最小的 \(a\),满足 \(a^b\equiv x \pmod {10^{len}}\)

考虑现在找到 \(a\),满足 \(a^b\equiv n\pmod{10}\),那么考虑构造 \(\pmod {100}\) 时的答案,显然我们有 \((a+10k)^b=a^b\),证明考虑二项式定理,也就是说我们可以尝试 \(a+10k,k\in [0,9]\),于是这样一位一位地类比构造下去就好了。

#include <bits/stdc++.h>
#define int long long
#define pb push_back
using namespace std;
int fpow(int x,int y,int mod) {
	int res=1; x%=mod;
	while(y) {
		if(y&1) res=res*x%mod;
		x=x*x%mod; y>>=1;
	} return res;
}

char s[15];
int n,len,b,Lim,ans=(int)(2e18);

void dfs(int x,int mod) {
//	if(ans!=-1) return ;
	if(x>ans) return ;
	if(mod==Lim) {
		ans=min(ans,x);
		return ;
	}
	for(int i=0;i<=9;i++) {
		int nx=i*mod+x;
		if(fpow(nx,b,mod*10)==n%(mod*10)) {
			dfs(nx,mod*10);
		}
//		if(ans!=-1) return ;
	}
}

void solve() {
	cin>>s+1>>b;
	n=0; len=strlen(s+1); Lim=1; ans=(int)(2e18);
	for(int i=1;i<=len;i++) n=n*10+s[i]-'0',Lim*=10;
	for(int i=0;i<=9;i++) {
		if(fpow(i,b,10)==n%10) {
			dfs(i,10);
		}
	} 
	if(ans>=(int)(2e18)) cout<<"-1\n";
	else cout<<ans<<'\n';
}

signed main() {
	cin.tie(0); ios::sync_with_stdio(false);
	int T; cin>>T; while(T--) solve();
	return 0;
}

标签:Lim,return,数字,int,res,ans,mod
来源: https://www.cnblogs.com/xugangfan/p/16460105.html