Necklace UVA - 11255(polya计数)

传送门
题目大意是给你三种颜色并给定相应的数量,请问能组成多少种不同的环(选择,对称同构)
Sample Input
2
3 2 1
2 2 2
Sample Output
6
11
颜色的个数类带有了限制,因为是对于环来说,所以其实还是比较好处理的
因为数量有了限制,所以不能单纯考虑置换的循环节的个数还要考虑循环节的长度。
先看旋转的情况,其实一直旋转后的置换的循环节的长度都是相等的。设:

num=gcd(i,n)

所以每个循环节的长度为:
len=nnum

设三个颜色的数量分别为 abc ,只有:
a%len=0
b%len=0
c%len=0
同时满足才是一个可行分配,那有多少个呢?有
iCa/lennumCb/lennuma/lenCc/lennuma/lenb/len

在看对称情况
如果n为奇数,那么循环节的情况是有 num=n12 个长度为2的循环节和一个长度为 1 的循环节,置换个数有n个
这个又要和abc的奇偶有关如果abc全为奇数,那不存在,如果恰好只有一个奇数,把那个奇数减1,则有:
Ca/2numCb/2numa/2Cc/2numa/2b/2n

如果为偶数,存在两种对称,点对称和边对称,点对称有 n2 num=n21 个长度为2的循环节和两个长度为1的循环节的置换,边对称有 n2 num=n2 个长度为2的循环节的置换
同样讨论 abc 的奇偶,如果均为偶,两种对称数量是相等的,一起写为:
Ca/2numCb/2numa/2Cc/2numa/2b/2n

如果奇数的个数为2:那么他在边对称的情况下是不存在的,只有满足点对称:
Ca/2numCb/2numa/2Cc/2numa/2b/22n2

涉及到大数,用java吧

import java.math.BigInteger;
import java.util.Scanner;

public class Main 
{
    static BigInteger fac[]=new BigInteger[45];
    static void init()
    {
        fac[0]=BigInteger.valueOf(1);
        for(int i=1;i<=40;i++)
            fac[i]=fac[i-1].multiply(BigInteger.valueOf(i));
    }
    static BigInteger get(int n,int m)//获得组合数
    {
        return fac[n].divide(fac[m]).divide(fac[n-m]);
    }
    static int gcd(int a,int b)
    {
        return a%b==0?b:gcd(b,a%b);
    }
    public static void main(String[] args)
    {
        Scanner sc=new Scanner(System.in);
        init();
        int t=sc.nextInt();
        int a,b,c;
        while(t-->0)
        {
            a=sc.nextInt();
            b=sc.nextInt();
            c=sc.nextInt();
            int n=a+b+c;
            BigInteger ans=new BigInteger("0");
            for(int i=1;i<=n;i++)
            {
                int num=gcd(i,n);
                int len=n/num;
                if(a%len==0&&b%len==0&&c%len==0)
                    ans=ans.add(get(num,a/len).multiply(get(num-a/len,b/len).multiply(get(num-a/len-b/len,c/len))));
            }
            if((n&1)==1)
            {
                int odd=0;
                if(a%2==1)
                    odd++;          
                if(b%2==1)
                    odd++;
                if(c%2==1)
                    odd++;
                if(odd==1)
                {
                    int num=n/2;
                    BigInteger temp=get(num,a/2).multiply(get(num-a/2,b/2)).multiply(BigInteger.valueOf(n));
                    ans=ans.add(temp);
                }
            }
            else
            {
                int odd=0;
                if(a%2==1)
                    odd++;
                if(b%2==1)
                    odd++;
                if(c%2==1)
                    odd++;
                if(odd==0)
                {
                    int num=n/2;
                    BigInteger temp=get(num,a/2).multiply(get(num-a/2,b/2)).multiply(BigInteger.valueOf(n));
                    ans=ans.add(temp);
                }
                if(odd==2)
                {
                    int num=n/2-1;
                    BigInteger temp=get(num,a/2).multiply(get(num-a/2,b/2)).multiply(BigInteger.valueOf(n));
                    ans=ans.add(temp);
                }
            }
            System.out.println(ans.divide(BigInteger.valueOf(2*n)));
        }
    }
}
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看rEADME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看rEADME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通;、 3本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看ReAdmE.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值