当k能够被p-1整除时:
i^k=(1^k/(p-1))^(p-1)=1 (mod p) (由费马小定理可得)
所以1^k+2^k+....+(p-1)^k= p-1(mod p)
当k不能够被p-1整除时:
设g为p的一个原根,所以(1^k+2^k+....+(p-1)^k)=(g^(1*k)+g^(2*k)+......+g^((p-1)*k))(mod p)
由费马小定理和等比数列公式可得:
上式等于 (g^(p*k)-g^k)/(g^k -1)=(g^k-g^k)/(g^k-1)=0
所以当(p-1)|k时为 p-1 ,其他为0。
我的代码:
#include <cstdio>
using namespace std;
int main (){
int k,p;
while (~scanf("%d%d",&k,&p)){
if (k/(p-1)%2) printf("YES\n");
else printf("NO\n");
}
return 0;
}