Source
Problem
输入正整数 ( ,找一个12位正整数 使得 。
Solution
一开始以为是解同余方程,想要构造答案,后来发现想歪了,只能枚举。这个式子可以使用不动点迭代来解。但是直接快速幂不仅超时,根本就算不出答案。参照这位大佬的乘法优化,可以快速迭代出答案。
Code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e12;
ll mul(ll a,ll b)
{
ll p=1<<20,pb=b>>20;
ll ans=(((a*pb%mod)*p%mod)+(a*(b&(p-1))))%mod;
return ans;
}
ll qpow(ll a,ll b)
{
ll ans=1;
while(b)
{
if(b&1) ans=mul(ans,a)%mod;
a=mul(a,a)%mod;
b>>=1;
}
return ans;
}
ll solve(int k,ll r)
{
while(1)
{
ll t=qpow(k,r);
if(t==r) return r;
r=t;
}
}
int main()
{
int k,rnd=0;
while(scanf("%d",&k),k)
{
ll r=1e12+9;
ll ans=solve(k,r);
printf("Case %d: Public Key = %d Private Key = %lld\n",++rnd,k,ans);
}
return 0;
}