fzu 2238 Daxia & Wzc's problem

来源:互联网 发布:mac python numpy安装 编辑:程序博客网 时间:2024/05/18 23:16

http://acm.fzu.edu.cn/problem.php?pid=2238


找规律题,只要想到对于m行第i个数,a和d的贡献次数即可,
然后用Lucas算法求一下分类组合数即可。。。


#include <cstdio>  #include <cstring>  #include <iostream>  #include <algorithm>  using namespace std;  typedef long long LL;  LL Power_mod(LL a, LL b, LL p)  {      LL res = 1;      while(b!=0)      {          if(b&1) res = (res*a)%p;          a = (a*a)%p;          b >>= 1;      }      return res;  }  LL Comb(LL a,LL b, LL p)  {      if(a < b) return 0;      if(a == b) return 1;      if(b > a-b) b = a-b;      LL ans = 1, ca = 1, cb = 1;      for(LL i=0; i<b; ++i)      {          ca = (ca*(a-i))%p;          cb = (cb*(b-i))%p;      }      ans = (ca*Power_mod(cb, p-2, p))%p;      return ans;  }  LL Lucas(int n, int m, int p)  {      LL ans = 1;      while(n && m && ans)      {          ans = (ans * Comb(n%p, m%p, p))%p;          n /= p;          m /= p;      }      return ans;  }  int main()  {      int a,d,m,i;     while(scanf("%d%d%d%d",&a,&d,&m,&i) !=EOF)      {      long long int ans1=Lucas(i+m-1,m,1000000007)*a%1000000007;    long long int ans2=Lucas(i+m-1,m+1,1000000007)*d%1000000007;    long long int ans=(ans1+ans2)%1000000007;        printf("%lld\n",ans);      }      return 0;  }  


原创粉丝点击