Java [2016年NOIP提高組] 組合數問題
阿新 • • 發佈:2019-02-05
輸入
第一行有兩個整數t, k ,其中t代表該測試點總共有多少組測試資料,k的意義見【問題描述】。
輸出
輸出t行,每行一個整數代表所有的 0 ≤ i ≤ n, 0 ≤j ≤ min (i, m) 中有多少對 (i, j) 滿足是 k 的倍數。
樣例輸入
1 2
3 3
樣例輸出
1
import java.math.BigInteger;
import java.util.Scanner;
import java.util.concurrent.CountDownLatch;
public class Main {
public static void main (String[] args) {
int a[][]=new int[2010][2010];
int b[][]=new int [2010][2010];
int n,m,ans,t,k;
Scanner scanner=new Scanner(System.in);
t=scanner.nextInt();
k=scanner.nextInt();
a[1][1]=1%k;
if (a[1][1]==0)
b[1][1]++;
for (int j=2;j<=2001;j++)
{
for (int q=1;q<=Math.min(j,2001);q++)
{
if (q==1)
a[j][q]=(a[j-1][q]+1)%k;
else
a[j][q]=(a[j-1][q]+a[j-1][q-1])%k;
if (a[j][q]==0)
b[j][q]=b[j][q-1 ]+1;
else
b[j][q]=b[j][q-1];
}
}
for (int i=1;i<=t;i++)
{
n=scanner.nextInt();
m=scanner.nextInt();
ans=0;
for (int j=1;j<=n;j++)
ans+=b[j][Math.min(m,j)];
System.out.println(ans);
}
}
}