费马小定理降幂--nkoj3687 整数拆分
2016-05-26 18:51
417 查看
P3687 整数拆分
时间限制 : - MS 空间限制 : 65536 KB评测说明 : 时限1000ms
问题描述
给你一个正整数N,F(x)表示把N拆分成x个正整数之和的方案数。
例如,当n=5时:
F(1)=1,方案为:{5}
F(2)=4,方案为:{1+4} {4+1} {2+3} {3+2}
F(3)=6,方案为:{1+1+3} {1+3+1} {3+1+1} {1+2+2} {2+1+2} {2+2+1}
F(4)=4,方案为:{1+1+1+2} {1+1+2+1} {1+2+1+1} {2+1+1+1}
F(5)=1,方案为:{1+1+1+1+1}
请你计算出F(1)+F(2)+......+F(N)
结果可能很大,mod 1,000,000,007 再输出!
输入格式
第一行,一个整数N
输出格式
一行,一个整数,表示所求的结果
样例输入
5
样例输出
16
提示
对于50%的数据1<=N<=100
对于100%的数据1<=N<=10^100000
/* 考点:费马小定理降幂 经观察很容易推出答案是2^(n-1) mod 1000000007,设p=1000000007 因为p是质数,根据费马小定理:a^(p-1) ≡1(mod p) 我们有: 2^(n-1)%p=2^((n-1)%(p-1)) %p */ #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int mod=1e9+7; char str[100005]; long long Montgomery(long long a,long long b,long long mod)//快速幂 { long long ans=1; while(b>0) { if(b&1)ans=(ans*a)%mod; a=(a*a)%mod; b=b>>1; } return ans; } int main(){ long long i,ans,num=0; scanf("%s",str); int len=strlen(str); for(i=0;i<len;i++){ num=( num*10+(str[i]-'0') )% (mod-1);//将字符数组转换成整数 } //num=n%(mod-1) if(num==0) ans=Montgomery(2,mod-2,mod);//此时n=mod-1,求2^(mod-2) else ans=Montgomery(2,num-1,mod); printf("%I64d\n",ans); return 0; }
如果要输入一个很大很大的数n,最后要输出n模一个数的结果怎么办呢?
代码如下:
#include<iostream>
#include<cstdio>
#define LL long long
using namespace std;
const LL p =1000000007;
void _read(LL &x){
char ch=getchar(); bool mark=false;
for(;!isdigit(ch);ch=getchar())if(ch=='-')mark=true;
for(x=0;isdigit(ch);ch=getchar())x=(x*10+ch-'0')%(p-1); //边读边取模
if(mark)x=-x;
}
int main(){
LL n;
_read(n);
cout<<n%p;
}
相关文章推荐
- laravel 邮箱改密功能
- 斐波那契数列及其应用
- iOS Archive 后进入other items,generic XCode Archive
- bzoj4517 sdoi2016 排列计数 错排
- OpennCV中Mat的属性介绍
- Interleaving String
- python代码优化
- 【Android】Fragment的简单笔记
- [HDU3861]The King's Problem(Tarjan缩点+二分图匹配)
- |Tyvj|BFS|P1117 拯救ice-cream
- NCBI网页上进行Nr注释
- java使double保留两位小数的多方法 java保留两位小数
- jaxp解析器用dom方式操作xml文档的总结
- Example: IPv4 or IPv6 client
- jQ源码之animate
- Unicode文件读取 出现隐藏字符 (大坑)
- 2016百度之星——D
- [Codeforces460D] Little Victor and Set(构造)
- JavaScript中的各种操作符使用总结
- block里的self、weakSelf、strongSelf