当前位置: 代码迷 >> 综合 >> 【51nod】1149 Pi的递推式
  详细解决方案

【51nod】1149 Pi的递推式

热度:69   发布时间:2023-10-29 09:25:38.0

前言

这题今年的时候liao在省选前给我们比赛的一道题。。
当时完全不会啊。。表示四题暴力分都没有拿完

题解

问题可以转换为,我们可以随意地加1或加π,问你有多少种方案可以加到 (n?4,n]
这样的话,明显就是可以排列组合的
但是边界一定要想清楚,因为你最后一个加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;
}