1. 程式人生 > >[HDU 4704] Sum · 費馬小定理 & 快速冪

[HDU 4704] Sum · 費馬小定理 & 快速冪

題意:給定n,設是將n分成k個數之和的方案數,求

隔板原理:將n個物品分成k組,相當於在n-1個間隔中插入k-1個隔板,方案數為,所以等於,貌似是叫二項式定理來著?反正這個式子的值等於,所以就是要求的值。

但是因為n非常大,所以用費馬小定理降冪。

科普:費馬小定理:

然後快速冪直接搞起。

這題是多測!

#include <cstdio>
#include <cstring>
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <cmath>
using namespace std;
#define ll long long

const ll mod=1e9+7;
const ll phi=mod-1;

ll n;
char s[200005];

void calc(){
	n=0;
	for (int i=0;s[i]!='\0';i++)
		n=(n*10+s[i]-'0')%phi;
	n+=phi;
	n--;
}

ll mult(ll n){
	ll ret=1,t=2;
	for(;n;n>>=1,t=(t*t)%mod) 
		if (n&1) ret=(ret*t)%mod;
	return ret;
}

int main(){
	while(~scanf("%s",s)){
		calc();
		cout<<mult(n)<<endl;
	}
	return 0;
}