社区讨论
TLE 95Pts 最慢点4.09S求调
P4718【模板】Pollard-Rho参与者 3已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @miibtzh9
- 此快照首次捕获于
- 2025/11/28 11:52 3 个月前
- 此快照最后确认于
- 2025/11/29 14:20 3 个月前
CPP
#include <bits/stdc++.h>
using namespace std;
const int N=1e2+10;
vector <long long > v;
long long t,n,tot,p[N],vis[N],c;
__int128 pw(__int128 a,__int128 b,__int128 Mod)
{
long long res=1;
while(b)
{
if(b&1) res=res*a%Mod;
a=a*a%Mod;
b>>=1;
}
return res;
}
int miller_rabin(long long k)
{
if(k<=100) return 1-vis[k];
long long r=k-1,s=0;
while((r&1)==0) r>>=1,s++;
for(int i=1;i<=12;i++)
{
__int128 a=p[i];
a=pw(a,r,k);
for(int i=0;i<s;i++)
{
if(a*a%k==1&&(a!=1&&a!=k-1)) return 0;
a=a*a%k;
}
if(a!=1) return 0;
}
return 1;
}
long long f(__int128 x,long long Mod)
{
return (x*x+c)%Mod;
}
void solve(long long k)
{
if(k==4)
{
v.push_back(2);
v.push_back(2);
return ;
}
if(miller_rabin(k)==1)
{
v.push_back(k);
return ;
}
c=1ll*rand()*rand()*rand();
long long i=f(0,k),j=f(f(0,k),k);
while(i!=j)
{
long long rs=__gcd(abs(i-j),k);
if(rs!=1)
{
solve(rs);
solve(k/rs);
return ;
}
i=f(i,k),j=f(f(j,k),k);
}
solve(k);
return ;
}
int main()
{
for(int i=2;i<=N-10;i++)
{
if(vis[i]==0)
{
p[++tot]=i;
for(int j=2*i;j<=N-10;j+=i) vis[j]=1;
}
}
scanf("%lld",&t);
while(t--)
{
scanf("%lld",&n);
v.clear();
solve(n);
sort(v.begin(),v.end());
if(v.size()==1) printf("Prime\n");
else printf("%lld\n",v[v.size()-1]);
// for(long long k:v) printf("%lld ",k);
// printf("\n");
}
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...