数论+快速幂-hdu-4704-Sum
来源:互联网 发布:光晕2windows live id 编辑:程序博客网 时间:2024/06/06 01:57
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=4704
题目大意:
给一个n,求出由1~n个正整数组成n的不同种数。
解题思路:
隔板法。
由一个数组成的话为C(n-1,0),两个的话为C(n-1,1),三个的C(n-1,2)....
所以结果为2^(n-1).
由于n很大有10^100000,显然不能直接快速幂,这里有两种处理方式。
1 因为2和M互质,所以由费马小定理得2^(M-1)=1 mod (M).所以2^n=2^((M-1)*k+p)=2^p mod M.
2 可以将2^n的次数n转化成十进制形式An*10^n+An-1*10^(n-1)+....+A1*10+A0 然后2^n=(2^(10^n))^An * (2^(10^n-1))^An-1 * .....* ((2^10)^A1) * 2^A0.
所以先预处理2,2^10,2^100,2^1000,....,2^(10^10000)
然后快速幂求出每一项的Ai次放就行了。
代码:
http://acm.hdu.edu.cn/showproblem.php?pid=4704
题目大意:
给一个n,求出由1~n个正整数组成n的不同种数。
解题思路:
隔板法。
由一个数组成的话为C(n-1,0),两个的话为C(n-1,1),三个的C(n-1,2)....
所以结果为2^(n-1).
由于n很大有10^100000,显然不能直接快速幂,这里有两种处理方式。
1 因为2和M互质,所以由费马小定理得2^(M-1)=1 mod (M).所以2^n=2^((M-1)*k+p)=2^p mod M.
2 可以将2^n的次数n转化成十进制形式An*10^n+An-1*10^(n-1)+....+A1*10+A0 然后2^n=(2^(10^n))^An * (2^(10^n-1))^An-1 * .....* ((2^10)^A1) * 2^A0.
所以先预处理2,2^10,2^100,2^1000,....,2^(10^10000)
然后快速幂求出每一项的Ai次放就行了。
代码:
#include<iostream>#include<cmath>#include<cstdio>#include<cstdlib>#include<string>#include<cstring>#include<algorithm>#include<vector>#include<map>#include<set>#include<stack>#include<list>#include<queue>#define eps 1e-6#define INF 0x1f1f1f1f#define PI acos(-1.0)#define ll __int64#define lson l,m,(rt<<1)#define rson m+1,r,(rt<<1)|1//#pragma comment(linker, "/STACK:1024000000,1024000000")using namespace std;/*freopen("data.in","r",stdin);freopen("data.out","w",stdout);*/#define M 1000000007#define N 110000ll sa[120000];ll quick(ll a,ll b) //求a^b mod M{ ll res=1; while(b) { if(b&1) res=(res*a)%M; a=(a*a)%M; b>>=1; } return res;}char save[N];int main(){ sa[0]=2; for(int i=1;i<=100000;i++) //sa[i]表示2^(10^i) mod M { sa[i]=quick(sa[i-1],10); } while(~scanf("%s",save)) { int n=strlen(save); int i=n-1; bool flag=true; if(save[i]!='0') //减去1 save[i]=save[i]-1; else { do //碰到10000-1的情况 { save[i]='9'; save[i-1]=save[i-1]-1; }while(save[i--]=='0'-1); } //printf("%s\n",save); ll ans=1; for(i=0;i<n;i++) //从后往前求出 { ans=(ans*quick(sa[i]%M,save[n-1-i]-'0'))%M; } printf("%I64d\n",ans); } return 0;}
- 数论+快速幂-hdu-4704-Sum
- 数论 --- 费马小定理 + 快速幂 HDU 4704 Sum
- hdu 4704 Sum(数论)
- [数论]HDU 4704 Sum 费马小定理
- HDU 4704 Sum 费马小定理+快速幂
- HDU 4704Sum(费马小定理+快速幂)
- HDU 4704 Sum(快速幂+费马小定理)
- Hdu 4704 Sum -- 快速幂+高精度处理
- hdu 4704 Sum (费马小定理+快速幂)
- HDU--4704 Sum【费马小定理,快速幂】
- HDU 4602 Partition 数论 AND 快速幂
- LS 38 Geometric sum(数论+二分快速幂)
- hdu 4704--sum(多校赛第十场)快速幂
- HDU 4704 Sum (费马定理+快速幂)
- HDU - 4704 Sum (费马小定理 + 快速幂)
- hdu 4704 sum(费马小定理+快速幂)
- [HDU 4704] Sum · 费马小定理 & 快速幂
- HDU 4704 SUM 整数快速幂+费马小定理
- 用C++编程调用libvirt的API来创建KVM虚拟机
- SLIP、PPP、PPPoE、L2TP以及PPTP协议
- Windows驱动_文件系统过滤驱动之九
- Shape of HDU(hdu2108,叉乘判断多边凹凸性)
- 国际化3
- 数论+快速幂-hdu-4704-Sum
- poj 1515 Street Directions(无向图改有向图)
- 进程间通信—信号量
- 程序员技术练级攻略(转)
- HDU 4431 Mahjong
- 模版方法模式
- convert unsigned long to char*
- 步入软件测试行业一年的总结
- C语言和C++中的基本程序(不断更新中)