1. 程式人生 > >解方程

解方程

max init -- text clas out center amp return

Equation

Input file: eqution.in

Output file: eqution.out

Time limit: 1 second

Memory limit: 256 MB

Mr. Ding 又來讓你幫忙解方程了。
方程是這樣的:
x1 + x1 + x3 +.....+ xn = m (xi >= 0 任意1<= i <= n)
Mr. Ding 希望你求出這個n 元一次方程的整數解有多少個,因為解的個數有可能變得很大,所以Mr.
Ding 只需要你輸出解的個數取模於mod。
Input
第1 行,包含一個整數:T,表示詢問個數
接下來T 行,每行包含三個整數:n m mod
Output
輸出T 行,每行輸出解的個數模對應mod
Sample
eqution.in

1

2 3 13
equation.out

4
Note
樣例中,解分別是:(3; 0); (2; 1); (1; 2); (0; 3)
? 對於30% 的數據,1 <= n ; m <= 6,mod = 10^8 + 7,T = 1
? 對於70% 的數據,1 <= n ; m <= 10^3,n + m <= mod <= 10^8 + 7,mod 是一個素數,1 <= T <= 100
? 對於余下30% 的數據,1 <= n ; m <= 10^3,n+m <= p ; q <= 10^4,mod = pq,p ; q 是素數,1 <= T <= 10^3

#include<stdio.h>
const int MAXN=1e3*2;
long long fac[MAXN+5],vfac[MAXN+5];


long long n,m,mod;

void exgcd(long long a,long long b,long long &x,long long &y){
    if(b==0) {x=1;y=0;return;}
    exgcd(b,a%b,y,x);
    y-=(a/b)*x;
}

long long rv(long long a,long long p){
    long long x,y;
    exgcd(a,p,x,y);
    
return (x%p+p)%p; } void init(){ fac[0]=1;//0的階乘為1 for(long long i=1;i<=n+m-1;i++) fac[i]=fac[i-1]*i%mod; vfac[m]=rv(fac[m],mod);//求i的階乘在mod意義下的逆 vfac[n-1]=rv(fac[n-1],mod); } int main(){ freopen("equation.in","r",stdin); freopen("equation.out","w",stdout); int t; scanf("%d",&t); while(t--){ scanf("%I64d%I64d%I64d",&n,&m,&mod); init(); long long ans=fac[m+n-1]*vfac[m]%mod*vfac[n-1]%mod; printf("%I64d\n",ans); } }

解方程