數論方向的題目,最近開始做做這方面的簡單題或者是模板題
題目大意:
根據費馬定理,如果p是一個素數,則對任意數字a,有,現在,題目要求找出p[不是素數]時,滿足此式的算式
其中運用到了快速冪取模的操作(由於數字太過大),這大概也是第一次解決帶有mod類型的題,雖然是個超級水題 = =
這種快速冪取模的方法是純模擬方法,網上其他代碼,例如用&判斷奇偶的代碼質量比我這個好很多,希望真正需要用快速冪取模的人學習那一種寫法
//自己從頭書寫快速冪取模算法,並進行優化分析
//
//
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <cstdio>
#define ll long long
using namespace std;
ll fast(ll b,ll n,ll m)//計算b的n次方對m取模
{
ll a = 1;
//首先把n進行二進制分解
int flagbinary = 0;
while(n>0)
{
if(n%2==0)//
{
flagbinary = 0;
n/=2;
}
else if(n%2!=0)//如果是奇數
{
flagbinary = 1;
n = n - 1;
n/=2;
}
if(flagbinary==0)
{
a = a%m;
b = (b%m*b%m)%m;//b還是要不斷地擴大的
}
else//
{
a = (a%m*b%m)%m;
b = (b%m*b%m)%m;
}
}
return a;
}
bool isprime(int a)
{
if(a==1)
{
return false;
}
else if(a==2)
{
return true;
}
else
{
for(int i=2;i<sqrt(a)+1;i++)
{
if(a%i==0)
{
return false;
}
}
return true;
}
}
int main(void)
{
while(1)
{
int p,a;
scanf("%d%d",&p,&a);
if(p==0&&a==0)
{
return 0;
}
ll temp = fast(a,p,p);
if(temp==a&&!isprime(p))
{
printf("yes\n");
}
else
{
printf("no\n");
}
}
}