【HDU】 1452 Happy 2004
2016-06-03 21:06
501 查看
Happy 2004
题目链接
Happy 2004题目大意
求2004n的所有因子和mod 29的值。题解
这一题如果知道一个数的因子和S(n)是积性函数的话就非常简单,直接分解并进行计算就行了,可是如果不知道呢?其实提公因式也可以。首先我们将2004n质因子分解
2004n=22n∗3n∗167n
现在如果我们对2004的所有因子求和,我们得到的肯定是这样的:
S(2004n)=20301670+20301671+...+22n3n167n
总共(2n+1)(n+1)2项,我们先考虑2和3的次方都是0的情况,我们将其求和,发现
20301670+20301671+...+2030167n=2030(1670+1671+...+167n)
后面是一个等比数列求和。因为我们没有考虑2和3的次方,所以还是有很多其他项的,如果我们现在将3的次方考虑进来,我们又会发现(sum(167)=1670+1671+...+167n)
2030sum(167)+2031sum(167)+...+203nsum(167)=20sum(3)sum(167)
同理,我们如果也把2的次方考虑进来的话,这个式子就完全变成了这样
sum(2)sum(3)sum(167)=S(2004n)
跟用积性函数得到的结果一模一样,可以说是证明了这个极性吧。
代码
#include <iostream> #include <cstring> #include <cstdio> #define mod 29 using namespace std; int x; int pow_mod(int a,int k) { int ans=1; while(k) { if (k&1) ans=(a*ans)%mod; k>>=1; a=(a*a)%mod; } return ans; } int main() { while(scanf("%d",&x),x) { int sum1,sum2,sum3,ans; sum1=pow_mod(2,2*x+1)-1; sum2=((((pow_mod(3,x+1)-1)%mod+mod)%mod)*pow_mod(2,mod-2))%mod; sum3=((((pow_mod(167,x+1)-1)%mod+mod)%mod)*pow_mod(166,mod-2))%mod; ans=(sum1*sum2*sum3)%mod; printf("%d\n",ans); } return 0; }
相关文章推荐
- Android 几何图形工具类GeometryUtil
- Android 开源框架Universal-Image-Loader
- Android4.4-Launcher源码分析系列之Launcher启动简介
- Android Studio遇到的那些坑及爬坑方法
- IOS开发 applicationDidBecomeActive 应用程序挂起、复原与终止
- Android开发--常用的传感器总结
- swift学习之路(十)字典
- developer.android.com 专业英语解读
- 在 cocos2d-x 中使用多组shader实现多重滤镜
- iOS学习笔记-----GCD 用法介绍
- android炫酷的复合文本--SpannableString
- 基于Android平台的五子棋小游戏------AI篇
- Android-PullParser解析xml文件
- swift学习之路(九)数组
- 如何阅读Android系统源码
- Android自定义view
- Spring笔记--ApplicationContext
- android产品研发(五)-->多渠道打包
- Android中的Uri.parse
- iOS 类似微信,QQ聊天界面的气泡聊天简单实现Demo