前言
这题今年的时候liao在省选前给我们比赛的一道题。。
当时完全不会啊。。表示四题暴力分都没有拿完
题解
问题可以转换为,我们可以随意地加1或加π,问你有多少种方案可以加到
这样的话,明显就是可以排列组合的
但是边界一定要想清楚,因为你最后一个加0或者加π,是完全不一样的
所以我们可以分开做
先做一种情况是加0的,另一种是加
CODE:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
using namespace std;
typedef long long LL;
const LL MOD=1e9+7;
const LL N=1000005;
const double pi=acos(-1);
LL n;
LL ny[N];
LL jc[N],JC[N];
LL C (LL x,LL y)//在x里面选y个
{return jc[x]*JC[y]%MOD*JC[x-y]%MOD;
}
int main()
{scanf("%lld",&n);ny[1]=1;for (LL u=2;u<=1000000;u++) ny[u]=(MOD-MOD/u)*ny[MOD%u]%MOD;jc[0]=JC[0]=1;for (LL u=1;u<=n;u++) {jc[u]=jc[u-1]*u%MOD;JC[u]=JC[u-1]*ny[u]%MOD;}if (n<4) {
printf("1\n");return 0;}n-=4;LL ans=0;for (LL u=0;u<=(int)(n/pi);u++)//用了多少个π,最后是填1进去的 {LL t=(int)(n-u*pi);ans=(ans+C(t+u,u))%MOD;}for (LL u=0;u<=n;u++)//用了多少个1,最后填PI{LL t=(int)((n-u)/pi);ans=(ans+C(t+u,u))%MOD;}printf("%lld\n",ans);return 0;
}