| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Why TLE?#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
long long c,e,n,d;
const long double capasize=1000000000;
long double myabs(long double a)
{
if (a<0) return -a;
else return a;
}
long long egcd(long long a,long long b,long long *x,long long *y)
{
if(b==0)
{
*x=1;
*y=0;
return a;
}
else
{
long long t,temp=egcd(b,a%b,x,y);
t=*x;
*x=*y;
*y=t-(a/b)*(*y);
return temp;
}
}
long long linemod(long long a,long long b,long long n)
{
long long x,y;
long long d=egcd(a,n,&x,&y);
if(b%d!=0) cerr<<"ERROR!!\n";
long long e=x*(b/d)%n;
while(e<0)
{
e+=n/d;
e%=n;
}
return e;
}
long double mymod(long double x)
{
long double temp=x/n,v=x/n;
while(temp>capasize) temp=temp/10;
long double t=long(temp);
int a;
while(v-temp>1)
{
t*=10;
temp*=10;
a=long(temp-t);
t+=a;
}
return x-t*n;
}
long long work(long double c,long long d)
{
if(d==1) return c;
else
{
if(d%2)
{
long double x=work(c,d/2);
x=mymod(x*x);
x*=c;
return mymod(x);
}
else
{
long double x=work(c,d/2);
return mymod(x*x);
}
}
}
long long gcd(long long a,long long b)
{
if(b==0) return a;
else return gcd(b,a%b);
}
long long pollard()
{
srand((unsigned)time( NULL ));
long long i=1,k=2;
long double x0=rand();
x0=mymod(myabs(x0*x0-rand()));
long double y=x0,x1,d,b;
while(true)
{
i++;
x1 = mymod(myabs(x0*x0-rand()));
d = gcd(myabs(y-x1),n);
if((d>1)&&(d<n))
return d;
if(i==k)
{
y = x0 = x1; k = 2*k;
}
else
x0 = x1;
}
}
int main(int argc, char *argv[])
{
long double t;
long long f;
while(cin >>c)
{
cin >>e>>n;
f=pollard();
t=(f-1)*(n/f-1);
d=linemod(e,1,t);
cout <<work(c,d)<<endl;
}
return 0;
}
Pollard那里怎么写会比较快一点啊?用long long应该会超的八
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator