ZJNU 2345 - 小Y的方格纸

明显,总共有n*m格,已经涂了k格

所以剩下n*m-k格

如果n*m-k<=k,即k已经占用了大于等于一半的格子,显然答案为0

否则

剩下的格子中取k+1,k+2...n*m-k格均可

取组合数求解,所以答案为

但因为组合数下标太大

可以处理杨辉三角(推荐)

或者处理因子

或者使用Python或者Java等等

C

 1 #include<stdio.h>
 2 const int mod=111111;
 3 int C[1005][1005];
 4 int main(){
 5     int i,j,n,m,k,ans=0;
 6     scanf("%d%d%d",&n,&m,&k);
 7     C[0][0]=1;
 8     C[0][1]=1;
 9     C[1][1]=1;
10     for(i=2;i<=n*m-k;i++){
11         C[0][i]=C[i][i]=1;
12         for(j=1;j<i;j++)
13             C[j][i]=(C[j-1][i-1]+C[j][i-1])%mod;
14     }
15     for(i=k+1;i<=n*m-k;i++)
16         ans=(ans+C[i][n*m-k])%mod;
17     printf("%d\n",ans);
18     
19     return 0;
20 }

Java

 1 import java.util.Scanner;
 2 import java.math.BigInteger;
 3 public class Main{
 4     static BigInteger getC(int u,int d){
 5         if(u>d)
 6             return BigInteger.ZERO;
 7         if(u>d-u)
 8             u=d-u;
 9         BigInteger ans=BigInteger.ONE;
10         for(int i=1;i<=u;i++)
11             ans=ans.multiply(new BigInteger(String.valueOf(d-i+1))).divide(new BigInteger(String.valueOf(i)));
12         return ans;
13     }
14     public static void main(String[] args){
15         Scanner in=new Scanner(System.in);
16         BigInteger ans=BigInteger.ZERO;
17         int n=in.nextInt(),m=in.nextInt(),k=in.nextInt(),ls;
18         ls=n*m-k;
19         for(int i=k+1;i<=ls;i++)
20             ans=ans.add(getC(i,ls)).remainder(new BigInteger("111111"));
21         System.out.println(ans);
22     }
23 }

猜你喜欢

转载自www.cnblogs.com/stelayuri/p/12238896.html