二项式系数(nCk)与大n和k的素数(P)的可分性

时间:2012-07-10 10:01:12

标签: algorithm math language-agnostic binomial-coefficients

在数学中,二项式系数是一族正整数,在二项式定理中作为系数出现。 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

由于约束非常大,动态编程将无法工作。我只想要一个想法。

2 个答案:

答案 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的相应数字。