zoukankan      html  css  js  c++  java
  • 【SCOI2010】生成字符串

    一个广为流传的$trick$,然而我现在才学会。

    题面

    https://www.luogu.org/problem/P1641

    题解

    在任意的前k个字符中,1的个数必须大于等于0的个数。

    我们把放一个$1$视为向右走一步,放一个$0$视为向上走一步,现在答案就转换为从$(0,0)$开始,走到$(n,m)$,并且不能跨越$y=x$,有多少种方案数。

    对于不合法的方案数:如果经过了$y=x+1$,我们就把它右下角的部分沿此直线翻折,这样就变成了从$(-1,1)$走到$(n,m)$的方案数,不难发现这样是一一对应的(从$(-1,1)$到任意一个终点都需要跨越$y=x+1$)。所以这个问题的答案就是$C_{n+m}^{n}-C_{n+m}^{n+1}$。

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #define ri register int
    #define mod 20100403
    using namespace std;
    int n,m;
    
    int pow(int a,int b) {
      int ret=1;
      for (;b;b>>=1,a=a*1LL*a%mod) if (b&1) ret=ret*1LL*a%mod;
      return ret;
    }
    
    int C(int n,int m) {
      int s=1,d=1;
      for (ri i=n;i>=n-m+1;i--) s=s*1LL*i%mod;
      for (ri i=1;i<=m;i++) d=d*1LL*i%mod;
      return s*1LL*pow(d,mod-2)%mod;
    }
    
    int main() {
      cin>>n>>m;
      cout<<(C(n+m,m)+mod-C(n+m,m-1))%mod<<endl;
      return 0;
    }
  • 相关阅读:
    表单提交:button input submit 的区别
    JavaScript中改变this指针的注意事项
    宝塔服务器配置nginx刷新404的问题汇总
    ES6笔记整理
    axios网络请求
    v-model双向绑定
    v-bind动态绑定
    前端模块化
    vue router 路由
    JS高阶函数
  • 原文地址:https://www.cnblogs.com/shxnb666/p/11479654.html
Copyright © 2011-2022 走看看