描述
问从(0,0)出发每一步可以向上走或者向右走,走到(n,m)的方案数有多少种?
输入格式
两个用空格隔开的整数n和m (mod 1e9+7)。
输出格式
一个整数,表示方案数。
样例输入
1 2
样例输出
3
数据范围与约定
- 对于100%的数据: n <= 1e5, m <= 1e5
样例解释
1 先向右走,然后一直往上走
2 先往上走,再往右走,最后再往上
3 先一直往上走,再往右走
快速幂求逆元;
#include<cstdio> #include<cstring> const int mod=1e9+7; long long aa[200010]; int phi; long long int poww(long long int a) { int b=phi-1; long long ans=1; while(b) { if(b&1) ans=ans*a%mod; b=b>>1; a=a*a%mod; } return ans; } int getphi(int x) { int sum=x; for(int i=2;i*i<=x;i++) { if(x%i==0) { sum=sum/i*(i-1); while(x%i==0) x/=i; } } if(x>1) sum=sum/x*(x-1); return sum; } int main() { int n,m; scanf("%d %d",&n,&m); if(n<=0||m<=0) { printf("0 "); return 0; } aa[1]=1;aa[0]=1; for(int i=2;i<=n+m+1;i++) aa[i]=aa[i-1]*i%mod; int t=mod; phi=getphi(t); // printf("%d-----",phi); // for(int i=1;i<=n+m;i++) printf("%d ",aa[i]); // ans=poww(n,m); // printf("%d",ans); long long ans=aa[n+m]; // printf("%d",ans); ans=ans*poww(aa[m])%mod*poww(aa[n])%mod; printf("%lld",(ans+mod)%mod); return 0; }
求phi函数;//其实不用,1e9+7是质数;嘻嘻
#include<cstdio> int getphi(int x) { int sum=x; for(int i=2;i*i<=x;i++) { if(x%i==0) { sum=sum/i*(i-1); while(x%i==0) x/=i; } } if(x>1) sum=sum/x*(x-1); return sum; } int main() { int n; scanf("%d",&n); if(n==1) { printf("1"); return 0; } int ans=getphi(n); printf("%d",ans); return 0; }