UVALive 7360 Run Step (JAVA阶乘求组合数)

本文介绍了一种使用Java实现的组合数学求解算法,该算法用于解决特定类型的组合计数问题,即如何将一个整数s拆分成若干个2和1的组合,要求2和1的数量均为偶数且2的数量不少于1的数量。通过枚举法计算所有可能的组合方式,并利用大数运算处理组合数计算,避免溢出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大体题意:

给你一个s,要求拆成2和1的和的形式,要求2的个数是偶数个,1的个数是偶数个,2不比1少,2和1的和为s

求方案数:

思路:

暴力求解即可! 直接枚举2的个数,在枚举1的个数

比如说2有m 个 1有n 个,那么这一组的答案就是( n+m)! / ((n!)*(m!) )

没有细想,直接用java大数了!

但也有教训,对java理解太少, 开数组竟然要用new,试了半小时= = !

import java.util.Scanner;  
import java.math.BigInteger;  
    public class Main{  
       // @SuppressWarnings("null")
		//@SuppressWarnings("null")
		public static void main(String[] args){  
            Scanner sc = new Scanner(System.in);  
            BigInteger ans,shang,xia,xia2;
            //BigInteger a73 = BigInteger.valueOf(10001);
//            BigInteger a137 = BigInteger.valueOf(137);
            int T ;
            T = sc.nextInt();
            
            BigInteger dp[] = new BigInteger[101];
            for (int i = 0; i < 101; ++i)dp[i] = BigInteger.valueOf(0);
            int sum2 = 0,sum1 = 0;
        	for (int s = 2; s <= 100; ++s){
        		for (sum2 = 0;sum2*2 <= s; sum2+=2){
        			for (sum1 = 0; sum1 <= sum2; sum1 += 2){
        				if (sum1 + sum2*2 != s)continue;
        				shang = BigInteger.valueOf(1);
        				xia = BigInteger.valueOf(1);
        				xia2 = BigInteger.valueOf(1);
        				for (int j = 1; j <= (sum1+sum2)/2; ++j){
        					shang = shang.multiply(BigInteger.valueOf(j));
        					
        				}
        				for (int j = 1; j <= sum1/2; ++j){
        					xia = xia.multiply(BigInteger.valueOf(j));
        					
        				}
        				for (int j = 1; j <= sum2/2; ++j){
        					xia2 = xia2.multiply(BigInteger.valueOf(j));
        					
        				}
        				ans = shang.divide(xia.multiply(xia2));
        				ans = ans.multiply(ans);
        				dp[s] = dp[s].add(ans);
        				
        			}
        		}
        		//System.out.println(s + " " + dp[s]);;
        	}
            
            
            for (int kase = 1; kase <= T; ++kase){
            	String k ;
            	int s = 0;
            	k = sc.next();
            	s = sc.nextInt();
            	//if (dp[s] != null)
            	System.out.println(k + " " + dp[s].toString());
            	//else System.out.println(k + " " + 0); 	
            	            	
            	
            }
        } 
    }  
    
    



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值