看了杭电上的解题报告,要用费马小定理,但是没有搞懂。。。队友用的打表,看了打出来的表,发现了规律。
这是打表用的一段代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <stack>
#include <queue>
#include <iostream>
#include <algorithm>
using namespace std;
long long a[100];
long long mypow(int a,int b)
{
long long ret = 1;
for(int i=0;i<b;i++){
ret *= a;
}
return ret;
}
int prime(int x){
for(int i = 2;i<x;i++){
if(x%i == 0)
return 0;
}
return 1;
}
int main()
{
int p, k;
for(p=2;p<=20;p++){
// prime(p);
long long sum = 0;
if(prime(p)){
for(int i=1;i<=30;i++){
sum = 0;
for(int j=1;j<p;j++){
sum += mypow(j,i);
}
a[i] = sum % p;
}
printf("p=%2d : ",p);
for(int i=1;i<=30;i++) printf("%d ",a[i]);
cout<<endl;
}
}
return 0;
}
发现只有k/(p-1)为奇数时DouBiNan才会赢,下面是这道题的解题代码
#include<stdio.h>
int main()
{
int k,p;
while(~scanf("%d %d",&k,&p))
{
if(k/(p-1)%2==0) printf("NO\n");
else printf("YES\n");
}
return 0;
}