【费马小定理】BZOJ3260 跳

Description

从(0,0)走到(n,m),没走过一个点(x,y)贡献为C(x,y),求最小贡献和。

 

Solution

让我们guess一下

走的路线一定是先走长的一边再走短的一边,两条直线

然后就是求组合数了

这个可以递推,除的时候用费马小定理解决

 

Code

get到了pow更短的写法

一开始m没取模溢出了几发

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<map>
 5 #define ll long long
 6 using namespace std;
 7 const int mod=1e9+7;
 8 
 9 ll pow(ll x,ll k){
10     ll ret=1;
11     for(int i=k;i;i>>=1,x=x*x%mod)
12         if(i&1) ret=ret*x%mod;
13     return ret;
14 }
15 ll n,m;
16 
17 int main(){
18     scanf("%lld%lld",&n,&m);
19     if(n>m) swap(n,m);
20     m%=mod;
21     ll ans=m+1;
22     
23     ll x=1;
24     for(int i=1;i<=n;i++){
25         x*=(m+i),x%=mod;
26         x*=pow(i,mod-2),x%=mod;
27         ans+=x,ans%=mod;
29     }
30     printf("%lld\n",ans);
31     return 0;
32 }

 

posted @ 2015-06-19 00:23  CyanNode  阅读(286)  评论(0编辑  收藏  举报