C 幂幂数字

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

任意模数高次剩余是吧。

考虑题目就是找到最小的 a,满足 abx(mod10len)

考虑现在找到 a,满足 abn(mod10),那么考虑构造 (mod100) 时的答案,显然我们有 (a+10k)b=ab,证明考虑二项式定理,也就是说我们可以尝试 a+10k,k[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; }

__EOF__

本文作者F x o r G
本文链接https://www.cnblogs.com/xugangfan/p/16460105.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   FxorG  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示