51Nod 1118 机器人走方格(dp/快速幂)

来源:互联网 发布:linux服务器系统占有率 编辑:程序博客网 时间:2024/06/02 00:48

题目链接


长知识了。。。

(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;}


原创粉丝点击