POJ1811(没有AC依旧TLE)

博主尝试解决一道复杂的算法题目,使用Miller-Rabin素性测试与Pollard's Rho因数分解算法,但仍在面对时间超出的问题。代码中包含了这些算法的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天估计我是脑残了才会来写这道题。。现在还在TLE中。。。用了miller_rabbin和pollard_rho其实到现在我也不太清楚pollard_rho是如何实现的。。。只是这道题真的好综合啊。。。而且好难啊。。。不会不会!!!!为毛我的代码现在还是TLE。。。

附上代码:(我实在是做不动了。。。)

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int a[64];
long long x[70];
long long gcd(long long x,long long y){
if(y==0){
return x;
}

else 
return gcd(y,x%y);
}
long long pollard_rho(long long n){
long long i=1;
x[1]=2;
long long y=x[1];
long long k=2;
long long d=1;
while(i<=70){
i=i+1;
x[i]=(x[i-1]*x[i-1]-1)%n;
if(y-x[i]>=0){
d=gcd(y-x[i],n);
}
else{
d=gcd(x[i]-y,n);
}
if(d!=1 && d!=n && d!=0)
return d;
if(i==k){
y=x[i];
k=2*k;
}

}
return d;


}
int f(long long n){
int k=0;
while(n){
a[k++]=n%2;
n=n/2;
}
return k;
}
long long modular_exp(long long b,long long n,long long m){
long long x=1;
long long power=b%m;
int k=f(n),i;
for(i=0;i<=k-1;i++){
if(a[i]==1)x=(x*power)%m;
power=(power*power)%m;
}
return x;
}
int miller_rabbin(long long n){
long long i,a;
for(i=1;i<=1000000;i++){
a=i;
if(modular_exp(a,n-1,n)!=1){
return a;
}

}
return 1;
}




main(){
int t,k,i;
long long n,min=-1,m;
scanf("%d",&t);
while(t--){
scanf("%lld",&n);
k=miller_rabbin(n);
if(k==1 || k==n)
 printf("Prime\n");
 else{
  if(n%2==0)
  printf("2\n");
  else{
  min=pollard_rho(n);
  m=min;
 n=n/m;
 k=miller_rabbin(n);
  while(!(k==1 || k==n)){
  m=pollard_rho(n);
  if(m<=min)
  min=m;
  n=n/m;
  k=miller_rabbin(n);
  }
 printf("%lld\n",min);
  }
 
  
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值