JUST CODE IT通过本文主要向大家介绍了51nod,51nod官网,51nod登录,51nod算法,51nod 1284等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
题目链接
长知识了。。。
(a+b)%mod=(a%mod+b%mod)%mod
a*b%mod=(a%mod*b%mod)%mod
a/b%mod =a*(b^(mod-2))%mod;
然后开干。。
第一种排列组合:
这个在高中基本都做过的题目,
从1,1到n,m一共朝下走n-1步,朝右走m-1步
总共n+m-2,然后选一条路n-1或者m-1就是结果
C(n+m-2,n-1)
因为结果要%mod,就要用到第三个公式
其中b^(mod-2)很明显的快速幂(前面才做到的题目)
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<queue> using namespace std; const long long mod=1000000000+7; long long sum(int x,int num){ long long fz=1; while(num--) fz*=x--,fz%=mod; return fz; } long long jc(int x){ long long sum=1; while(x) sum*=x--,sum%=mod; return sum; } long long ksm(long long x){ long long mm=mod-2; long long sum=1,temp=x; while(mm){ if(mm&1) sum=sum*temp%mod; temp*=temp; temp%=mod; mm=mm>>1; } return sum%mod; } int main(){ int n,m; cin>>n>>m; int minn=(n,m); int fz=jc(n-1); int su=sum(n+m-2,n-1); /* (x/y) %mod =x*(y^(mod-2))%mod; */ long long chshu=ksm(fz); //cout<<fz<<" "<<su<<" "<<chshu<<endl; cout<<su*chshu%mod; return 0; }
第二种dp:
这题类似于小兔子跳楼梯,每一个点都是由上面或者左面的移动一次得到
dp[i][j]=(dp[i-1][j]%mod+dp[i][j-1]%mod)%mod
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<queue> using namespace std; const long mod=1000000000+7; int main(){ int n,m; cin>>n>>m; int a[1001][1001]; a[1][1]=1; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(i==1&&j==1) continue; a[i][j]=(a[i-1][j]%mod+a[i][j-1]%mod)%mod; } } cout<<a[n][m]; return 0; }