Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

Re:请教int和__int64的区别

Posted by skogt at 2010-10-21 20:57:46 on Problem 3518
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:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator