51nod1149 Pi的递推式

基准时间限制:1 秒 空间限制:131072 KB 分值: 640

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

数学问题 递推 组合数

实数下标的递推,甚至不能记忆化(吧?),递归显然不可取。

可以先考虑一般的情况。

比如Fibonacci数列的递推式是 $ F[n]=F[n-1]+F[n-2] $

众所周知,它的组合数意义可以解释为任选走一级或走两级,从0级上到n级台阶的方案数。(然而蒟蒻博主就不知道)

由此得出F[n]的另一个计算方式是枚举走两级走了i次,然后 $F[n]=\sum_{i=0}^{n/2} C(n-2i+i,i) $

这个算法可以推广到一般的递推式。

那么在本题中,可以类似地枚举走1和走pi的次数,累计从0走到大于n-4的位置的方案数。

由于枚举走1或枚举走pi时,另一个走法的次数上限不同(第一次到达>n-4的位置时,到达的具体位置不同),所以要分类讨论。

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<cmath>
 6 #define LL long long
 7 using namespace std;
 8 const double pi=acos(-1.0);
 9 const int mxn=1000010;
10 const int mod=1e9+7;
11 int read(){
12     int x=0,f=1;char ch=getchar();
13     while(ch<‘0‘ || ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
14     while(ch>=‘0‘ && ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
15     return x*f;
16 }
17 int ksm(int a,int k){
18     int res=1;
19     while(k){
20         if(k&1)res=(LL)res*a%mod;
21         a=(LL)a*a%mod;
22         k>>=1;
23     }
24     return res;
25 }
26 int fac[mxn],inv[mxn];
27 void init(int ed){
28     fac[0]=fac[1]=1;inv[0]=inv[1]=1;
29     for(int i=2;i<=ed;i++)
30         fac[i]=(LL)fac[i-1]*i%mod;
31     inv[ed]=ksm(fac[ed],mod-2);
32     for(int i=ed-1;i;i--)
33         inv[i]=(LL)inv[i+1]*(i+1)%mod;
34     return;
35 }
36 inline int C(int n,int m){
37     if(n<m)return 0;
38     return (LL)fac[n]*inv[m]%mod*inv[n-m]%mod;
39 }
40 int n;
41 int ans=0;
42 int main(){
43     int i,j;
44     n=read();
45     if(n<4){
46         printf("1\n");return 0;
47     }
48     init(n);
49     for(i=0;i<=n-4;i++){//1
50         int tmp=(int)(((double)n-4-i)/pi);
51 //        printf("i:%d tmp:%d %d\n",i,tmp,C(tmp+i,i));
52         (ans+=C(tmp+i,i))%=mod;
53     }
54     for(i=0;i*pi<=n-4;i++){//pi
55         int tmp=(int)(n-4-i*pi);
56 //        printf("i:%d tmp:%d %d\n",i,tmp,C(tmp+i,i));
57         (ans+=C(tmp+i,i))%=mod;
58     }
59     printf("%d\n",ans);
60     return 0;
61 }
时间: 2024-12-30 13:54:12

51nod1149 Pi的递推式的相关文章

【51nod】1149 Pi的递推式

题解 我们把这个函数的递归形式画成一张图,会发现答案是到每个出度为0的点的路径的方案数 这个可以用组合数算 记录一下P[i]为i减几次PI减到4以内 如果P[i + 1] > P[i],那么转向的路径走P[i]次,否则走P[i] - 1次 代码 #include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <vector> #in

51NOD 1149:Pi的递推式——题解

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1149 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的结果即可. 不好想啊……以及我曾经打了个表,并且还找到了规律,结果过到29就gg了…… 参考:https://blog.

递推式转化为矩阵形式

EXAMPLE: 递推式: d(n + 2) = p * d(n + 1) + (1 - p) * d(n); 令G(n) = (d(n + 2), d(n + 1))^T; 则 G(n + 1) = M * G(n); 解得 M = p   1 - p 1    0 G(n) = (M ^ n) * G(0); #

hiho 1143 矩阵快速幂 求递推式

题目链接: hihocoder 1143 思路见题目上 快速幂模板: // m^n % k int quickpow(int m,int n,int k) { int b = 1; while (n > 0) { if (n & 1) b = (b*m)%k; n = n >> 1 ; m = (m*m)%k; } return b; } 题解: #include<iostream> #include<cstdio> #include<cstring

Python的递推式构造列表(List comprehension)

介绍 我们在上一章学习了“Lambda 操作, Filter, Reduce 和 Map”, 但相对于map, filter, reduce 和lamdba, Guido van Rossum更喜欢用递推式构造列表(List comprehension).在这一章我们将会涵盖递推式构造列表(List comprehension)的基础功能. 递推式构造列表(List comprehension)是在Python 2.0中添加进来的.本质上,它是一种数学家用来实现众所周知标记集合的Python方式

一只青蛙从第一级台阶跳到第n级,每次可以跳任意级,共有多少种跳法,并写出递推式

是斐波那契数列问题 假设f(n)是n个台阶跳的次数:(假设已经调到第n个台阶,最后一次是由哪个台阶跳上来的) f(n) = f(n-1)+f(n-2)+...+f(n-(n-1)) + f(n-n) == f(0) + f(1) + f(2) + f(3) + ... + f(n-2) + f(n-1) == f(n) = 2*f(n-1) 所以,可以得出递推式: 1 public static int jumpFloor(int n) { 2 if (n <= 0) 3 return 0; 4

【HDU4990】递推式

题目大意:给定序列 1, 2, 5, 10, 21, 42, 85, 170, 341 …… 求第n项 模 m的结果 递推式 f[i]  = f[i - 2] + 2 ^ (i - 1); 方法一: 构造矩阵, 求递推式 方法二: 直接推公式,递推式求和,得到 f[n] = [2 ^ (n + 1) - 1] / 3 奇数, f[n] = [2 ^ (n + 1) - 2] / 3 偶数: 其实还可以进一步化简, 注意到 2 ^ 2k % 3 = 1, 2 ^ (2k + 1) % 3 = 2,

错排递推式推导

今天听课讲容斥,提到错排,突然发现错排公式什么的好像已经忘了233 努力地回忆了一下,算出前几项,终于还原出了那个递推式↓ f(n)=(n-1)*(f(n-1)+f(n-2)) 根据人赢的教导,只要思(yi)考(yin)下错排的构造就能记住了 然后就认(meng)认(you)真(yi)真(yang)地思(yi)考(yin)了下 用自己的理解把这玩意儿整理了一下↓ 先加一点平时我们说的错排通常是指1~n,f(i)≠i, 其实脑补一下,它也可以看成A,B两个集合,|A|=|B|,对于每一个Ai,都对

hdu 1757 A Simple Math Problem (构造矩阵解决递推式问题)

题意:有一个递推式f(x) 当 x < 10    f(x) = x.当 x >= 10  f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + -- + a9 * f(x-10) 同时ai(0<=i<=9) 不是 0 就是 1: 现在给你 ai 的数字,以及k和mod,请你算出 f(x)%mod 的结果是多少 思路:线性递推关系是组合计数中常用的一种递推关系,如果直接利用递推式,需要很长的时间才能计算得出,时间无法承受,但是现在我们已知