题意:给出k个球和质数p,对每个球以公式val(i)=1^i+2^i+...+(p-1)^i (mod p)计算出它的价值,然后两个人轮流拿,最后拿到的球的总价值大的获胜,问我们先手是否获胜。
我们分成两种情况讨论:
情形1:i%(p-1)==0,即i是(p-1)的倍数,由费马小定理 a^(p-1)=1(mod p),可以套入公式得该球价值为 p-1;
情形2:i不是(p-1)的倍数,这时要用到原根的性质,对于一个正整数g和质数p,若g为p的原根,可将1,2,3...p-1表示为g^1,g^2,g^3...g^(p-1),那么
带入公式可得val(i)=1^i+2^i+...+(p-1)^i (mod p)=g^i+g^(2*i)+g^(3*i)+...+g^((p-1)*i),即可以用等比公式得到val(i)=(g^i * (g^i*(p-1) - 1)/(g^i-1),
由于费马小定理可得,val(i)=0;
那么既然val(i)只在i为(p-1)的倍数时为1,最后只要统计k是(p-1)的倍数,判断为奇则输出“YES”,否则为“NO";
相关资料:
http://baike.baidu.com/link?url=dJ6_gXINuYRpcHkyHrJ_DmFY8BnVQioHG3IOjajxzwnEHncWUvue_uz8exyr44sKMeZRE0MgIhv-17kpZwO12q
http://baike.baidu.com/link?url=nLUeG8Lxckv9FceAt_ceDZIP1K_RLncVYaOlbtp3M-LpZJXMqNJDcHZ1iUA5XTe0NVAILGhpYfi_jPe6bf3FGa
http://baike.baidu.com/link?url=WtHCJTPisLPTKNL4vDtSa-fHkEXSRfetxA_T_xZZxzeqdEEqKTxvTxSyIzuZLW_1leWJrLWv5QmBmaARW2FJgK
推荐blog:
http://blog.csdn.net/keshuai19940722/article/details/38050899
http://blog.csdn.net/RaAlGhul/article/details/51882067
1 #include<cstdio> 2 3 int k,p; 4 5 int main() 6 { 7 while(scanf("%d%d",&k,&p)==2) 8 { 9 k/=(p-1); 10 if(k&1) puts("YES"); 11 else puts("NO"); 12 } 13 }