题目意思:2004^x的所有正因数的和(S)对29求余;输出结果;

原题链接

题目解析:解析参照来源:点击打开链接

因子和

6的因子是1,2,3,6; 6的因子和是s(6)=1+2+3+6=12;

20的因子是1,2,4,5,10,20; 20的因子和是s(20)=1+2+4+5+10+20=42;

2的因子是1,2; 2的因子和是s(2)=1+2=3;

3的因子是1,3; 3的因子和是s(3)=1+3=4;

4的因子和是 s(4)=1+2+4=7;

5的因子和是 s(5)=1+5=6;

s(6)=s(2)*s(3)=3*4=12;

s(20)=s(4)*s(5)=7*6=42;

这是巧合吗?

再看 s(50)=1+2+5+10+25+50=93=3*31=s(2)*s(25),s(25)=1+5+25=31.

这在数论中叫积性函数,当gcd(a,b)=1时s(a*b)=s(a)*s(b);

如果p是素数

s(p^n)=1+p+p^2+...+p^n=(p^(n+1)-1) /(p-1) (1)

例 hdu1452 Happy2004

计算 因子和 s(2004^X) mod 29,

2004=2^2 *3 *167

s(2004^X) ) = (s(2^2X))) *(s(3^X))) * (s(167^X)))

167)=22;

s(2004^X) ) = (s(2^2X))) *(s(3^X))) * (s(22^X)))

a=s(2^2X)=(2^(2X+1)-1)//根据 (1)

b=s(3^X)= (3^(X+1)-1)/2//根据 (1)

c=s(22^X)= (22^(X+1)-1)/21//根据 (1)

%运算法则 1. (a*b) %p= ( a%p) *(b%p)

%运算法则 2. (a/b) %p= ( a *b^(-1)%p)

b^(-1)是 b的逆元素 (%p)

2的逆元素是15 ()) ,因为2*15=30 % 29=1 % 29

21的逆元素是18 ()) ,因为21*18=378% 29 =1 % 29

因此

a=(powi(2,2*x+1,29)-1)%29;

b=(powi(3,x+1,29)-1)*15 %29;

c=(powi(22,x+1,29)-1)*18 %29;

ans=(a*b)% 29*c % 29;

资料拓展: 1. 高次幂快速取模链接

2.积性函数:在数论中的积性函数:对于正整数n的一个算术函数 f(n),若f(1)=1,且当a,b互质时f(ab)=f(a)f(b),在数论上就称它为积性函数。若对于某积性函数 f(n) ,就算a, b不互质,也有f(ab)=f(a)f(b),则称它为完全积性的。若将n表示成质因子分解式

则有

3.求逆元:

在计算(a/b)%Mod时,往往需要先计算b%Mod的逆元p(b有逆元的条件是gcd(b,Mod)==1,显然素数肯定有逆元),然后由(a*p)%Mod得结果c。这里b的逆元p满足(b*p)%Mod=1。先来简单证明一下:

(a/b)%Mod=c;    (b*p)%Mod=1;    ==》   (a/b)*(b*p) %Mod=c;    ==》    (a*p)%Mod=c;

从上面可以看出结论的正确性,当然这里b需要是a的因子。接下来就需要知道根据b和Mod,我们怎么计算逆元p了。扩展欧几里德算法,大家应该都知道,就是已知a、b,求一组解(x,y)使得a*x+b*y=1。这里求得的x即为a%b的逆元,y为b%a的逆元(想想为什么?把方程两边都模上b或a看看)。调用ExtGcd(b,Mod,x,y),x即为b%Mod的逆元p。

求b%Mod的逆元p还有另外一种方法,即p=b^(Mod-2)%Mod,因为b^(Mod-1)%Mod=1(这里需要Mod为素数)。

错误分析:1:

if(y&1)ans*=x%29;//误把试中ans=x*x%29

2.数据类型要用__int64,

代码实现:

#include<cstdio>
#include<cstdlib>
using namespace std;
typedef __int64 ll;
ll powmol(ll x,ll y)//高次幂取模的求x^ymod29
{
ll ans=1;
x=x%29;
while(y)
{
if(y&1)ans*=x%29;//y是奇数情况的处理;
x=x*x%29;
y>>=1;//
}
return ans;
}
int main()
{
ll x,a,b,c;
while(scanf("%I64d",&x),x)
{
a=(powmol(2,2*x+1)-1)%29;
b=(powmol(3,x+1)-1)*15%29;
c=(powmol(22,x+1)-1)*18%29;
printf("%I64d\n",(a*b)%29*c%29);
}
return 0;
}

最新文章

  1. 【初码干货】【Azure系列】1、再次感受Azure,体验Windows Server 2016并部署BlogEngine.NET
  2. TagHelper是怎么实现的
  3. PHP webservice的使用
  4. struts2+spring的两种整合方式
  5. Ubuntu 配置 no-ip
  6. win7下装ubuntu14.04双系统
  7. python 给定n,返回n以内的斐波那契数列
  8. [转] Jenkins实战演练之Windows系统节点管理
  9. 基于NHibernate的开发框架的设计
  10. (转)Android Binder设计与实现 – 设计篇
  11. 【转】get a mysterious problem,when i use HttpWebRequest in unity c# script
  12. Python 日期格式化 及 schwartzian排序
  13. 15、Cocos2dx 3.0游戏开发找小三之Sprite:每一个精灵都是上辈子折翼的天使
  14. root用户安装的软件在普通用户不生效
  15. 编程算法 - 求1+2+...+n(函数指针) 代码(C++)
  16. [翻译]MEAN.IO与MEAN.JS的前世今生
  17. SSH深度历险(十一) AOP原理及相关概念学习+xml配置实例(对比注解方式的优缺点)
  18. Python学习笔记 - 迭代Iteration
  19. CentOS7完成mysql的安装和远程访问
  20. Python之OS内置模块

热门文章

  1. 关于负数的isdigit()判断
  2. Jquery学习笔记:操作form表单元素之一(文本框和下拉框)
  3. CVPapers论文整理工具-开源
  4. CuSparse 第一章
  5. iOS 使用Block实现函数回调
  6. 一个带动画效果的颜色选择对话框控件AnimatedColorPickerDialog
  7. WPF(布局)
  8. “Clang” CFE Internals Manual---中文版---&quot;Clang&quot;C语言前端内部手册
  9. urllib模块
  10. jquery 如何动态添加、删除class样式方法介绍