SRM-16 A-1

描述

     问从(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\n");
        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;
}
View Code

 求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;
}
View Code

 

posted @ 2017-09-22 14:33  12fs  阅读(113)  评论(0编辑  收藏  举报