数论初步(费马小定理) - Happy 2004
Description
Consider a positive integer X,and let S be the sum of all positive integer divisors of 2004^X. Your job is to determine S modulo 29 (the rest of the division of S by 29).
Take X = 1 for an example. The positive integer divisors of 2004^1 are 1, 2, 3, 4, 6, 12, 167, 334, 501, 668, 1002 and 2004. Therefore S = 4704 and S modulo 29 is equal to 6.
Input
The input consists of several test cases. Each test case contains a line with the integer X (1 <= X <= 10000000).
A test case of X = 0 indicates the end of input, and should not be processed.
Output
For each test case, in a separate line, please output the result of S modulo 29.
Sample Input
1
10000
0
Sample Output
6
10
-----------------------------------------------------------------我是分割线^_^--------------------------------------------------------------------------------
这个题的题目倒是挺happy的,做题的我一点都不happy,我一直在想这都什么方法,毕竟水太深了,我也溺水了= =
老样子,先解释题目:题目的意思就是给定一个X,要求求出2004的X次方的因数和,因数和嘛,比如4的因数和就是
1 + 2 + 4 = 7,然后呢,题目的意思就是这样,然偶我就懵比了,懵比了很久搜题解去了,搜到了还是懵比,什么鬼题解,
就不能说详细一点吗,详细一点的打字又不准确,不理解的部分有那么多.............算了不吐槽了= =
先来一条科普:费马小定理,
费马小定理(Fermat Theory)是数论中的一个重要定理,其内容为: 假如p是质数,且gcd(a,p)=1,那么 a^(p-1)≡1(mod p)。
即:假如a是整数,p是质数,且a,p互质(即两者只有一个公约数1),那么a的(p-1)次方除以p的余数恒等于1。
结合一下同余德定理,a^(p - 1)%p = 1%p = 1,也就是说,在一些情况下可以把1替换成前面那个东西,等一下有用。
看着题目当然没头绪,直接来方法吧,我们先把2004分解质因数,得到了2,3,167,这些东西有什么用呢?下面再来看看一个新东西
一个数的因子和是一个积性函数
关于积性函数,即F(ab)=F(a)*F(b),在数论里有很多积性函数
来证明一下:
S(x)表示x的因子和。
如果x可以分成a,b(一定为素数),那么S(x)=S(a)*S(b)。
为什么一定要分成素数呢,因为一个素数的因子之后1和它本身,对于a,b 来说,就是1,a,1,b,那么x=a*b,x的因子只有1,a, b,x这四个数,
这就是所谓的一个数的因子和是一个积性函数。
则题目求为:S(2004^X)mod 29
那么可以知道:2004=4 * 3 *167(注意到4不是质数,但使用要求必须是质数,所以要替换成2的平方)
S(2004^X)=S(2^(2X)) * S(3^X) * S(167^X)
如果 p 是素数 则其因子只有1和它本身,因此在求其因数和的时候可以使用等比数列的求和公式,不懂得自己去用错位相减法重温一下高中知识= =,
所以有:S(p^X)=1+p+p^2+...+p^X = (p^(X+1)-1)/(p-1),这个表达式的意思是求p的x次方的这个数的因数和
所以:S(2004^X) % 29 = (2^(2X+1)-1) % 29 * (3^(X+1)-1)/2 % 29 * (167^(X+1)-1)/166 % 29,
因为答案是要对29取模的,所以前面一项可以动用快速幂取模算出来了,可是后面两个带有除法就有点难搞了,
在乘法中可以a*b%c = (a%c * b%c)%c, 加法中也可以有(a+b+c)%c = (a+(b+c)%c)%c,减法也是有的,和加法一样,
可惜的是除法是个奇葩,它非主流= =,所以不能这样这样算,不信的话你算一算(14/2)%4,你换成(14%4) / (2%4)答案
是不一样的,这个时候就要用到一种叫做逆元的东西,它的作用是把除法改成乘法取模,比如a/b % c 可以改成 a * b^(c-2)%c,
其中b^(c-2)%c就是b的逆元,这只是逆元的一种求解方法,由于结合了费马小定理,这种方法比较适合于计算机,因为可以用快速幂
取模进行运算求解,现在来开始变化:a/b % c = a * b^(-1) % c = a * b^(-1) * 1 % c,然后倒回去看上面的费马小定理的下面
那一条小提示,就可以把1替换了,结果变成了a * b^(-1) * b^(c-1) % c = a * b^(c-2) % c,好的,如此一来就顺利完成的转换,
除法的取模也变成的乘法,接下来就可以使用快速幂取模进行大屠杀了,不过写代码的时候要注意减一(等比数列求和)..........
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
using namespace std; int Mod(int a, int b, int c) {//快速幂取模算出a的b次方模c的结果
int ans = 1;
while (b) {
if (b & 1) {
ans = ans * a % c;
}
b >>= 1;
a = a * a % c;
}
return ans;
} int main()//如果看n有点不习惯,就按照上面的习惯看,把n换成x就行了
{
//freopen("input.txt", "r", stdin);
int n;
while (scanf("%d", &n), n) {
int a = Mod(2, 2 * n + 1, 29) - 1;//求S(a) int b = (Mod(3, n + 1, 29) - 1) * Mod(2, 27, 29);//求S(b) int c = (Mod(22, n + 1, 29) - 1) * Mod(21, 27, 29);//这里把167换成了22,是因为22与167对29是同余的,所以简化一下,求S(c)
printf("%d\n", a * b * c % 29);//这里就是答案,S(答案) = S(a) * S(b) * S(c),还不理解就上去看看奇性函数= =
}
return 0;
}
数论初步(费马小定理) - Happy 2004的更多相关文章
- ZOJ 3785 What day is that day?(数论:费马小定理)
What day is that day? Time Limit: 2 Seconds Memory Limit: 65536 KB It's Saturday today, what da ...
- HDU 1452 Happy 2004(因数和+费马小定理+积性函数)
Happy 2004 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
- 数论 --- 费马小定理 + 快速幂 HDU 4704 Sum
Sum Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=4704 Mean: 给定一个大整数N,求1到N中每个数的因式分解个数的 ...
- Codeforces 919E Congruence Equation ( 数论 && 费马小定理 )
题意 : 给出数 x (1 ≤ x ≤ 10^12 ),要求求出所有满足 1 ≤ n ≤ x 的 n 有多少个是满足 n*a^n = b ( mod p ) 分析 : 首先 x 的范围太大了,所以使 ...
- poj 1845 【数论:逆元,二分(乘法),拓展欧几里得,费马小定理】
POJ 1845 题意不说了,网上一大堆.此题做了一天,必须要整理一下了. 刚开始用费马小定理做,WA.(poj敢说我代码WA???)(以下代码其实都不严谨,按照数据要求A是可以等于0的,那么结果自然 ...
- 【poj 1284】Primitive Roots(数论--欧拉函数 求原根个数){费马小定理、欧拉定理}
题意:求奇质数 P 的原根个数.若 x 是 P 的原根,那么 x^k (k=1~p-1) 模 P 为1~p-1,且互不相同. (3≤ P<65536) 解法:有费马小定理:若 p 是质数,x^( ...
- HDU4675【GCD of scequence】【组合数学、费马小定理、取模】
看题解一开始还有地方不理解,果然是我的组合数学思维比较差 然后理解了之后自己敲了一个果断TLE.... 我以后果然还得多练啊 好巧妙的思路啊 知识1: 对于除法取模还需要用到费马小定理: a ^ (p ...
- 费马小定理&欧拉定理
在p是素数的情况下,对任意整数x都有xp≡x(mod p).这个定理被称作费马小定理其中如果x无法被p整除,我们有xp-1≡1(mod p).利用这条性质,在p是素数的情况下,就很容易求出一个数的逆元 ...
- 【BZOJ】3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛(排列组合+乘法逆元+欧拉定理/费马小定理)
http://www.lydsy.com/JudgeOnline/problem.php?id=3398 以下牡牛为a,牝牛为b. 学完排列计数后试着来写这题,“至少”一词可以给我们提示,我们可以枚举 ...
随机推荐
- JavaWeb学习之什么JSP、JSP是如何工作的、JSP语言(各种指令和九大内置对象)、EL表达式简单使用(5)
1.什么JSP * servlet:java编写的处理动态web的技术 * 特点:Java代码中嵌套html代码 * jsp * 特点:HTMl代码中嵌套java代码 * %tomcat%/conf/ ...
- n的阶乘高精度算法【阶乘】
C语言实验——求阶乘(循环结构) Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 题目链接:http://acm.sdut.edu ...
- 情定XMLA,割舍不下的XAML
俗话说,不玩Silverlight的APP Developer,在DBA圈里就不是好的数据分析师.嗯,你没看错,题目里,一样东西是XMLA,一样东西是XAML.前者是用来玩SSAS的 ,一样是用来玩S ...
- PHPCMS 多站点管理切换问题
打开系统函数库global.func.php 可以看到获取站点ID的函数如下 /** * 获取当前的站点ID */ function get_siteid() { static $siteid; if ...
- C#中的Infinity有个小坑
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 昨天家里有事,上网也不方便,就没有推送文章.今天很累,也不长篇大论了.简单介绍一下最近遇到的 ...
- 内容分发网络CDN(互联网技术)
内容分发网络(互联网技术)CDN的全称是Content Delivery Network,即内容分发网络.其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快.更 ...
- HDU 3364 Lanterns 高斯消元
Lanterns Problem Description Alice has received a beautiful present from Bob. The present contains ...
- 生成n位随机字符串
--1.借助newid() Go --创建视图(因为在函数中无法直接使用newid()) create view vnewid as select newid() N'MacoId'; go --创建 ...
- 自定义adapter实现listview双列显示
package com.appshare; import java.util.ArrayList;import java.util.List; import android.content.Conte ...
- EventBus代替Intent将复杂对象传递给下一个即将启动的Activity
我觉得EventBus确实非常好,把我们从序列化中解脱出来,即使不序列化也能在界面间传递数据,但是有个前提,那是两个界面都已经存在并且注册了EventBus.而即将启动的下一个Activity就非常尴 ...