您的位置:首页 > 其它

uva 10006 快速幂

2015-07-27 12:54 357 查看
比较基本的数论题目,不过《挑战程序设计》上说这个题有不用幂运算求解的两种方法,一种复杂度为根号n,一种是O(n)预处理,O(1)判定,我还没有想出来....

快速幂的方法:

#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;

typedef long long ll;
const int N = 65001;
bool visit
;

void sieve( int n )
{
int r = sqrt( n + 0.5 );
memset( visit, 0, sizeof(visit) );
visit[0] = visit[1] = 1;
for ( int i = 2; i <= r; i++ )
{
if ( !visit[i] )
{
for ( int j = i * i; j <= n; j += i )
{
visit[j] = 1;
}
}
}
}

ll pow_mod( ll a, ll n, ll mod )
{
ll ans = 1, w = a % mod;
while ( n )
{
if ( n & 1 )
{
ans = ans * w % mod;
}
w = w * w % mod;
n >>= 1;
}
return ans;
}

int main ()
{
sieve( N - 1 );
int n;
while ( cin >> n, n )
{
bool flag = true;
if ( visit
)
{
for ( int x = 2; x < n; x++ )
{
int tmp = pow_mod( x, n, n );
if ( tmp != x )
{
flag = false;
break;
}
}
}
else
{
flag = false;
}
if ( flag )
{
cout << "The number " << n << " is a Carmichael number." << endl;
}
else
{
cout << n << " is normal." << endl;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: