• 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;	
    }
    
  • 相关阅读:
    逆元应用求组合数
    树的重心入门
    扫描线求面积的并,交
    涂抹果酱
    牧场的安排
    「SCOI2005」互不侵犯
    Network Coverage
    Linux命令传输文件
    VMware Workstation 与 Device/Credential Guard 不兼容.在禁用 Device/Credenti
    Springboot开启SpringSecurity
  • 原文地址:https://www.cnblogs.com/sdfzsyq/p/10065266.html
Copyright © 2020-2023  润新知