zoukankan      html  css  js  c++  java
  • 51nod 1149 Pi的递推式(组合数学)

    传送门

    解题思路

      首先因为(Pi)不是整数,所以不能直接递推。这时我们要思考这个式子的实际意义,其实(f(i))就可以看做从(i)这个点,每次可以向右走(Pi)步或(1)步,走到[0.4)的方案数。这样的话我们就可以枚举一下走一步的次数(i),然后走(Pi)步的次数就是(leftlfloordfrac{n-i}{Pi} ight floor)。最后还要讨论一下最后一步能不能走(1)步,然后用组合数算一下。

    代码

    #include<iostream>
    #include<cstdio>
    #include<cmath> 
    
    using namespace std;
    const int MAXN = 1000005;
    const int MOD = 1e9+7;
    const double Pi = acos(-1);
    typedef long long LL;
    
    int n,fac[MAXN]={1},inv[MAXN];
    LL ans;
    
    int fast_pow(int x,int y){
    	int ret=1;
    	for(;y;y>>=1){
    		if(y&1) ret=(LL)ret*x%MOD;
    		x=(LL)x*x%MOD;
    	}
    	return ret;
    }
    
    inline LL C(int x,int y){
    	if(x<y) return 0;
    	return (LL)fac[x]*inv[y]%MOD*inv[x-y]%MOD;	
    }
    
    int main(){
    	scanf("%d",&n);
    	for(int i=1;i<=n;i++) fac[i]=(LL)fac[i-1]*i%MOD;
    	inv[n]=fast_pow(fac[n],MOD-2);
    	for(int i=n-1;~i;i--) inv[i]=(LL)inv[i+1]*(i+1)%MOD;
    	for(int i=0;i<=n;i++){
    		if(n-i-(int)((n-i)/Pi)*Pi>=3) ans+=C((n-i)/Pi+i,i);
    		else ans+=C((int)(n-i)/Pi+i-1,i);	
    		ans%=MOD;
    	}printf("%lld",ans);
    	return 0;	
    }
    
  • 相关阅读:
    node异步转同步(循环)
    三级省市区PCASClass.js插件
    微信公众号基础总结(待更新)
    ES6详解
    webpack配置
    高性能 CSS3 动画
    github上传口令
    纯css3 实现3D轮播图
    优美的js代码,拿去玩~
    关于列举属性用点还是用【】
  • 原文地址:https://www.cnblogs.com/sdfzsyq/p/10065266.html
Copyright © 2011-2022 走看看