hdu--4861--费马小定理&&素数的原根
2014-12-17 21:11
183 查看
可以用打表找规律过这题。 但这显然不是这题的初衷。
题意很简单 其实就是判断 var = ( 1^i + 2^i + ... + (p-1)^i ) ( mod p )//很重要的一个初始条件:p是素数
首先 你一定要知道费马小定理。
假如p是素数 并且gcd(a,p)=1 那么 a^(p-1)≡1( mod p) <因为我这边没好的数学公式编辑器 我只能用文字来描述一些东西 >
我们发现 上面 var的式子中 下标值是从1-(p-1) 就满足了上面关于a的要求
那么当(p-1)|i 即(p-1)整除i 成立时 那么每一个小式子的值都是1 一共有p-1个式子 所以var = p-1
这题的难点是 求出 (p-1)与I没有整除关系的时候 var的值是多少
这边 又要涉及一个数学概念:原根
在a^(x)≡1( mod p)成立下 如果x的最小次数是 p-1 那么将a称为模p的原根。<每个素数p都是由原根的,确切地说,每个素数p都有 f(p-1)个模p的原根>
这边的f(z)函数是 欧拉函数 这也是可以证明的 我这边不写了 因为我觉得这个证明起来还是蛮麻烦的
对于模p的原根g来说
g^1,g^2,g^3....g^(p-1) mod p的值对应着1,2,3....p-1的不同次序的排列
下面我们来证明它的正确性。
假设g^i≡g^j(mod p) 那么p整除(g^i-g^j) //这边假设i>=j 这是没有关系的 因为i j必然存在一个大小关系 当然你可以说j>=i
p|(g^i-g^j) -> p|( g^j * ( g^(i-j) - 1 ) 因为 gcd( p , g^j ) = 1那么 p|g^(i-j)-1 也就是说
g^(i-j)-1 = k*p+1(k=0,1,2,3,....) 也就是说 g^(i-j)≡1( mod p) <看到这边 你是否想到了费马小定理>
现在让我们来推翻自己的假设
1<=j<=i<=p-1 -> 0<=i-j<=p-2 那么想要让 g^(i-j)≡1( mod p) 成立 只能使i-j=0了 那么 i == j了
所以 假设错误 不存在不同的i j使g^i , g^j 对P取模有不同的值 所以对于上面的那个结论正确性得证。
那么 我们就可以进行一个关键的转换步骤了
var = ( 1^i + 2^i + ... + (p-1)^i ) ( mod p )
var = ( g^1^i + g^2^i + ....+ g^(p-1)^i) ( mod p )//这边我转换的是 将 1^i+2^i+3^i+...+(p-1)^i整体进行等效替代的 因为是不同次序 但是中间的运算符是加号
var = ( g^i^1 + g^i^2 + ....+ g^i^(p-1) ( mod p )//你会惊喜地发现 现在变成一个等比式子 首项是g^i 并且公比也是g^i 我们现在求出它的数列和
Sn = (g^i) * ( 1-(g^i^(p-1) ) / ( 1-g^i )
Sn = (g^i) * ( 1-(g^(p-1)^i) ) / ( 1-g^i ) 因为g^(p-1)≡1 ( mod p )所以Sn = 0
注意下 在 (p-1)|i 时 分母为0 这时候 是不能进行等比求和计算的。
所以 最终我们只要考虑 k / (p-1)的个数的奇偶性就可以了
如果是偶数 先手打平 如果是奇数 先手胜利
//上面的推导过程 可能还是存在一些问题 见谅= = 有些时候 会不能很好的表述出来。。 最好留言大家一起讨论下啊。。
View Code
题意很简单 其实就是判断 var = ( 1^i + 2^i + ... + (p-1)^i ) ( mod p )//很重要的一个初始条件:p是素数
首先 你一定要知道费马小定理。
假如p是素数 并且gcd(a,p)=1 那么 a^(p-1)≡1( mod p) <因为我这边没好的数学公式编辑器 我只能用文字来描述一些东西 >
我们发现 上面 var的式子中 下标值是从1-(p-1) 就满足了上面关于a的要求
那么当(p-1)|i 即(p-1)整除i 成立时 那么每一个小式子的值都是1 一共有p-1个式子 所以var = p-1
这题的难点是 求出 (p-1)与I没有整除关系的时候 var的值是多少
这边 又要涉及一个数学概念:原根
在a^(x)≡1( mod p)成立下 如果x的最小次数是 p-1 那么将a称为模p的原根。<每个素数p都是由原根的,确切地说,每个素数p都有 f(p-1)个模p的原根>
这边的f(z)函数是 欧拉函数 这也是可以证明的 我这边不写了 因为我觉得这个证明起来还是蛮麻烦的
对于模p的原根g来说
g^1,g^2,g^3....g^(p-1) mod p的值对应着1,2,3....p-1的不同次序的排列
下面我们来证明它的正确性。
假设g^i≡g^j(mod p) 那么p整除(g^i-g^j) //这边假设i>=j 这是没有关系的 因为i j必然存在一个大小关系 当然你可以说j>=i
p|(g^i-g^j) -> p|( g^j * ( g^(i-j) - 1 ) 因为 gcd( p , g^j ) = 1那么 p|g^(i-j)-1 也就是说
g^(i-j)-1 = k*p+1(k=0,1,2,3,....) 也就是说 g^(i-j)≡1( mod p) <看到这边 你是否想到了费马小定理>
现在让我们来推翻自己的假设
1<=j<=i<=p-1 -> 0<=i-j<=p-2 那么想要让 g^(i-j)≡1( mod p) 成立 只能使i-j=0了 那么 i == j了
所以 假设错误 不存在不同的i j使g^i , g^j 对P取模有不同的值 所以对于上面的那个结论正确性得证。
那么 我们就可以进行一个关键的转换步骤了
var = ( 1^i + 2^i + ... + (p-1)^i ) ( mod p )
var = ( g^1^i + g^2^i + ....+ g^(p-1)^i) ( mod p )//这边我转换的是 将 1^i+2^i+3^i+...+(p-1)^i整体进行等效替代的 因为是不同次序 但是中间的运算符是加号
var = ( g^i^1 + g^i^2 + ....+ g^i^(p-1) ( mod p )//你会惊喜地发现 现在变成一个等比式子 首项是g^i 并且公比也是g^i 我们现在求出它的数列和
Sn = (g^i) * ( 1-(g^i^(p-1) ) / ( 1-g^i )
Sn = (g^i) * ( 1-(g^(p-1)^i) ) / ( 1-g^i ) 因为g^(p-1)≡1 ( mod p )所以Sn = 0
注意下 在 (p-1)|i 时 分母为0 这时候 是不能进行等比求和计算的。
所以 最终我们只要考虑 k / (p-1)的个数的奇偶性就可以了
如果是偶数 先手打平 如果是奇数 先手胜利
//上面的推导过程 可能还是存在一些问题 见谅= = 有些时候 会不能很好的表述出来。。 最好留言大家一起讨论下啊。。
#include <iostream> using namespace std; int main() { int x , y , ans; while( cin >> x >> y ) { ans = x / (y-1); if( ans&1 ) cout << "YES" << endl; else cout << "NO" << endl; } return 0; }
View Code
相关文章推荐
- poj 3641&hdu 1905(伪素数判定)
- HDU-Eddy's research I-拆分素数
- hdu 3037 Saving Beans 求Comb(n,m)%p p是素数且p<=10000
- HDU Largest prime factor && nyoj 520 最大素因子【素数】
- nyoj 488 && hdu 1016 素数环
- HDU 1397 Goldbach's Conjecture(素数判断)
- HDU 1397 Goldbach's Conjecture(素数打表)
- HDU 1164 Eddy's research I(素数连乘)
- HDU 2098 分拆素数和
- Hdu 4715 Difference Between Primes (2013网络赛 warm up) & LightOJ 1259 Goldbach`s Conjecture(素数和差)
- HDU 1164 Eddy's research I(将数分解成素数之积)
- ACM刷题之HDU————相遇周期(真·打表(素数筛选))
- 【HDU 6069 Counting Divisors】 + 素数筛 & 思维
- [HDU] 3660 Alice and Bob's Trip -- 树形DP?
- http://acm.hdu.edu.cn/showproblem.php?pid=2303 (素数打表 + java大数取模)
- hdu 2276 Kiki & Little Kiki 2(矩阵构造乘法)
- hdu 1695 GCD 求(1,b)和(1,d)中互素的数对的对数 求不大于b的数中与now不互素的数的个数(now>b) 容斥原理
- HDU 1009 FatMouse' Trade
- POJ 2262 Goldbach's Conjecture(素数表)
- hdu 2451 Simple Addition Expression 问(i+i+1+i+2) 中间没有进位的个数 (i<n)