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 |
Re:请教int和__int64的区别In Reply To:请教int和__int64的区别 Posted by:200630551488 at 2010-09-07 16:32:40 > 用int处理速度极慢,对于(n>100000)等很长时间没结果 > 改用__int64可以在30ms左右计算出来。 > 请问两者区别在哪? > 代码: > #include <iostream> > using namespace std; > ////accepted code > __int64 MultMod(__int64 base, __int64 pow, __int64 n) > { > __int64 result = 1; > while(pow) > { > while(!(pow&1)) > { > base = base*base % n; > pow >>= 1; > } > result = result*base % n; > pow --; > } > return result; > } > > bool RabbinMiller(__int64 n) > { > __int64 t = 0; > __int64 M = n-1; > __int64 v; > __int64 a,i; > > a = rand()%(n-1)+1; > //cout <<"a="<<a<<endl; > > while(!(M&1)) > { > t++; > M >>= 1; > } > > v = MultMod(a,M,n); > > if(v == 1) > return true; > > i = 1; > while(v != n-1) > { > if(i == t) > { > return false; > } > v = MultMod(v,2,n); > i++; > } > return true; > } > > bool NRabinMiller(__int64 n,int loop) > { > if(n < 2) > return false; > if(n == 2) > return true; > else if(!(n&1)) > { > return false; > } > else > { > int i; > for(i = 0; i < loop; ++i) > { > if(!RabbinMiller(n)) > return false; > } > } > return true; > > } > /* > //TLE when using int; > int MultMod(int base, int pow, int n) > { > int result = 1; > while(pow) > { > while(!(pow&1)) > { > base = base*base % n; > pow >>= 1; > } > result = result*base % n; > pow --; > } > return result; > } > > bool RabbinMiller(int n) > { > int t = 0; > int M = n-1; > int v; > int a,i; > > a = rand()%(n-1)+1; > //cout <<"a="<<a<<endl; > > while(!(M&1)) > { > t++; > M >>= 1; > } > > v = MultMod(a,M,n); > > if(v == 1) > return true; > > i = 1; > while(v != n-1) > { > if(i == t) > { > return false; > } > v = MultMod(v,2,n); > i++; > } > return true; > } > > bool NRabinMiller(int n,int loop) > { > if(n < 2) > return false; > if(n == 2) > return true; > else if(!(n&1)) > { > return false; > } > else > { > int i; > for(i = 0; i < loop; ++i) > { > if(!RabbinMiller(n)) > return false; > } > } > return true; > > } > */ > > int main() > { > int n; > while(1) > { > scanf("%d",&n); > if(n == 0) > break; > int left = n; > int right = n; > int result = 0; > > if(NRabinMiller(n,8)) > cout << 0 << endl; > else > { > while(--left) > { > if(NRabinMiller(left,8)) > break; > } > while(++right) > { > if(NRabinMiller(right,8)) > break; > } > cout << right-left << endl; > } > } > return 0; > } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator