1149 Pi的递推式



基准时间限制:1 秒 空间限制:131072 KB 分值: 640  难度:8级算法题



 收藏

 关注

F(x) = 1 (0 <= x < 4)


F(x) = F(x - 1) + F(x - pi) (4 <= x)


Pi = 3.1415926535.....


现在给出一个N,求F(N)。由于结果巨大,只输出Mod 10^9 + 7的结果即可。


Input


输入一个整数N(1 <= N <= 10^6)


Output


输出F(N) Mod 10^9 + 7


Input示例


5


Output示例


3



李陶冶  (题目提供者)







【分析】

组合数。辣鸡题目。根本没头绪系列。




【代码】

//51nod 1149 Pi的递推式
#include<bits/stdc++.h>
#define pi acos(-1)
#define ll long long
#define M(a) memset(a,0,sizeof a)
#define fo(i,j,k) for(i=j;i<=k;i++)
using namespace std;
const int mxn=1000005;
const int mod=1e9+7;
int n,m,T,ans;
int fac[mxn],inv[mxn];
inline void init()
{
	int i,j;
	fac[0]=inv[0]=inv[1]=1;
	fo(i,1,n) fac[i]=(ll)fac[i-1]*i%mod;
	fo(i,2,n) inv[i]=(ll)(mod-mod/i)*inv[mod%i]%mod;
	fo(i,1,n) inv[i]=(ll)inv[i]*inv[i-1]%mod;
}
inline ll C(int n,int m)
{
	if(n<m) return 0;
	return (ll)fac[n]*inv[m]%mod*inv[n-m]%mod; 
}
int main()
{
	int i,j;
	scanf("%d",&n);init();
	if(n<4) return puts("1"),0;
	fo(i,0,n-4)
	{
		int t=((double)n-4-i)/pi;
		ans=(ans+C(t+i,i))%mod;
	}
	for(i=0;pi*i<=n-4;i++)
	{
		int t=(n-4-pi*i);
		ans=(ans+C(t+i,i))%mod;
	}
	printf("%d\n",ans);
	return 0;
}