明显,总共有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 }
原文:https://www.cnblogs.com/stelayuri/p/12238896.html