在数学中,二项式系数是一族正整数,在二项式定理中作为系数出现。 nCk表示从n个不同对象中选择k个对象的方式数。
然而,当n和k太大时,我们经常在模数运算后用素数P保存它们。请用P求模后计算n的二项式系数变为0。
输入的第一个是整数T,即测试用例的数量。
以下T行中的每一行包含2个整数,n和素数P.
对于每个测试用例,输出一行包含nCk的数量(0 <= k <= n),其中每个模数运算后的P为0。
3
2 2
3 2
4 3
1
0
1
由于约束非常大,动态编程将无法工作。我只想要一个想法。
答案 0 :(得分:0)
这是关于数学的问题。
import java.io.*;
import java.math.BigInteger;
import java.util.*;
public class Solution{
public static void main(String[] args){
Scanner scan=new Scanner(System.in);
int T=Integer.parseInt(scan.nextLine());
int i,j;
long p;
long y;
int[] digit=new int[501];
int[] odigit=new int[501];
int[] res=new int[501];
int[] ans=new int[501];
while(0!=(T--)){
String[] line=scan.nextLine().split(" ");
p=Integer.parseInt(line[1]);
for(i=0;i<line[0].length();i++)
digit[i+1]=odigit[i]=(line[0].charAt(i))-48;
digit[0]=odigit[0]=line[0].length()+1;
//基转换
//进制转换,10进制转换成p进制
res[0]=0;
while(digit[0]>1){
y=0;i=1;
ans[0]=digit[0];
while(i<digit[0]){
y=y*10+digit[i];
ans[i++]=(int)((double)y/(double)p);
y%=p;
}
res[++res[0]]=(int)y;
i=1;
while(i<ans[0]&&ans[i]==0)
i++;
digit[0]=1;
for(j=i;j<ans[0];j++)
digit[digit[0]++]=ans[j];
}
res[0]++;
//大数相乘
BigInteger odata=new BigInteger(line[0]);
BigInteger pdata=new BigInteger("1");
for(i=1;i<res[0];i++)
pdata=pdata.multiply(new BigInteger((res[i]+1)+""));
odata=odata.subtract(pdata).add(new BigInteger("1"));
System.out.println(odata.toString());
}
}
}
编辑(代码缩短为nhahtdh):
import java.math.BigInteger;
import java.util.*;
class Solution {
// Get the base b intepretation of n
private static ArrayList<Integer> toBase(BigInteger n, BigInteger b) {
ArrayList<Integer> out = new ArrayList<Integer>();
while (!n.equals(BigInteger.ZERO)) {
out.add(n.mod(b).intValue());
n = n.divide(b);
}
return out;
}
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
int T = scan.nextInt();
while((T--) > 0){
BigInteger n = scan.nextBigInteger();
BigInteger p = scan.nextBigInteger();
ArrayList<Integer> res = toBase(n, p);
BigInteger pdata = BigInteger.ONE;
for (int i: res) {
pdata = pdata.multiply(BigInteger.valueOf(i + 1));
}
BigInteger output = n.subtract(pdata).add(BigInteger.ONE);
System.out.println(output);
}
}
}
答案 1 :(得分:0)
引自Lucas' theorem页面:
二项式系数\ tbinom {m} {n}可被素数p整除,如果和 只有当n的基本p位数中的至少一个大于 m的相应数字。