HDU 4704 SUM 整数快速幂+费马小定理
2015-09-04 20:05
501 查看
题目描述:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4704题目
分析:
题目要求s1+s2+s3+…+sn;(si表示n划分i个数的n的划分的个数,如n=4,则s1=1,s2=3)假设An=s1+s2+s3+…+sn,
对于n可以先划分第一个数为n,n-1,n-2,…,1,则容易得出
An=A0+A1+A2+A3+…+A(n-1)
=>A(n+1)=A0+A1+A2+A3+…+An =>An=2^(n-1);
由于n非常大,所以这里要用到费马小定理:
a^(p-1)%p == 1%p == 1;//p为素数
所以
2^n%m==(2^(n%(m-1))* 2^(n/(m-1)*(m-1)))%m
== (2^(n%(m-1)))%m * ((2^k)^(m-1))%m
== (2^(n%(m-1)))%m;
其中k=n/(m-1)
代码
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define mod 1000000007 using namespace std; char s[100000+5]; __int64 MOD(char *a,int Mod){ __int64 sum=0; for(int i=0;a[i] != '\0';++i){ sum=(sum*10+a[i]-'0')%Mod; } return sum; } __int64 FastPow(__int64 a,__int64 k){ k=(k+mod)%mod; __int64 sum=1; while(k){ if (k&1) sum=sum*a%mod; a=a*a%mod; k>>=1; } return sum; } int main(){ while(scanf("%s",s)!=EOF){ __int64 n=MOD(s,mod-1)-1; printf("%I64d\n",FastPow(2,n)); } return 0; }
相关文章推荐
- POJ 2337 Catenyms(欧拉路径)
- ping结果中TTL是什么意思
- usaco Cow Tours
- Linux系统管理-(9)-yum工具
- Struts2整合Spring
- 网易游戏2016实习生招聘笔试题目--推箱子
- 4.7.4 Constructing LALR Parsing Tables
- reverse list
- Windows7 x64系统下安装Nodejs并在WebStorm 9.0.1下搭建编译less环境
- 点击UITableView的cell展开收缩
- ubuntu 如何设置成中文
- C++ 唯一三元操作符: 条件操作符?
- usaco Money Systems
- java安全沙箱(二)之.class文件检验器
- 【HDU1845】【完备匹配】
- const相关用法(Effective C++_3)
- [2015hdu多校联赛补题]hdu5301 Buildings
- Eclipse和PyDev搭建完美Python开发环境(Windows篇)
- Kinect v2.0原理介绍之八:高清面部帧(1) FACS 介绍
- 最小生成树(2)