2017 ACM区域赛现场赛 青岛站 E (polya计数)

题目链接(暂无)

吐槽:这场比赛感觉对我感觉还算友好,虽然Q群知乎上命题方已经被喷死了,C语言上机题还有字符串题有大腿队友轻松搞定,网络流恰是我能想出来的,E本来也应该是在能力范围内,不过因为之前没写过跑程序搜置换的题,一时看到就发怵。。万幸过掉了K题网络流拿到了金,不然场上没写E打铜得后悔死我。。

题意:一个3*3*1的长方体,有3*3(顶面)+3*4(侧面)+3*3(底面)=30个待染色的小面,长方体有四个可扭动的轴,位于四条边的中间那个1*1*1的小块,每次可扭动180°。支持的基本的置换为上下翻转,绕中心旋转,将3*1*1的边绕轴扭动。给定颜色数c和模数p,求总的非等价染色方案数模p的结果。

爆搜求置换;对每种置换求循环指数,从而得到循环指数为k(1<=k<=30)的循环个数;套用Polya公式

(注意p可能非质数所以会有一个特殊处理,见下图(tot为置换总数))

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef __int128 LLL;

const int N=30;
int ori[N]= {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29};

int tr[3][N]=
{
//    { 0, 1, 2, 3, 4, 5, 6, 7, 8,     9,10,11,12,13,14,15,16,17,18,19,20,        21,22,23,24,25,26,27,28,29},
    {29,25,24,23,22,21,28,27,26,    16,15,14,13,12,11,10,9 ,20,19,18,17,          5, 4, 3, 2, 1, 8, 7, 6, 0},
    {0,3,4,5,6,7,8,1,2,                12,13,14,15,16,17,18,19,20,9 ,10,11,        23,24,25,26,27,28,21,22,29},
    {0,23,22,21,4,5,6,7,8,            13,12,11,10,9 ,14,15,16,17,18,19,20,        3 ,2 ,1 ,24,25,26,27,28,29}
};

int ans[1600][N];
int tot;

void dfs(int cur)
{
    for(int i=0; i<3; i++)
    {
        int temp[N];
        for(int j=0; j<N; j++)
            temp[j]=ans[cur][tr[i][j]];
        int flag=1;
        for(int k=0; k<tot; k++)
        {
            int flag1=1;
            for(int j=0; j<N; j++)
                if(ans[k][j]!=temp[j]) flag1=0;
            if(flag1)    //flag1=true 表示 temp和某个ans[k]全等
            {
                flag=0;
                break;
            }
        }
        if(flag)    //flag=true 表示 temp和任意ans[k]不全等
        {
            for(int j=0; j<N; j++)
                ans[tot][j]=temp[j];
            tot++;
            dfs(tot-1);
        }
    }
}

int cnt[N];
int vis[N];
void dfs2(int x,int y[])
{
    vis[x]=1;
    if(!vis[y[x]]) dfs2(y[x],y);
}
void add(int y[])
{
    memset(vis,0,sizeof(vis));
    int t=0;
    for(int i=0;i<N;i++) if(!vis[i])
    {
        t++;
        dfs2(i,y);
    }
    cnt[t]++;
}

LLL qpow(LLL x,LLL n,LLL mod)
{
    LLL ret=1;
    for(;n;n>>=1)
    {
        if(n&1) ret=ret*x%mod;
        x=x*x%mod;
    }
    return ret;
}
LLL qpow(LLL x,LLL n)
{
    LLL ret=1;
    for(;n;n>>=1)
    {
        if(n&1) ret=ret*x;
        x=x*x;
    }
    return ret;
}
int main()
{
    for(int i=0; i<N; i++) ans[0][i]=ori[i];
    tot++;
    dfs(0);
    printf("%d\n",tot);
    printf("\n========================================\n\n");
    for(int i=0;i<tot;i++)
        add(ans[i]);
    for(int i=1;i<=N;i++)
        printf("%2d : %d\n",i,cnt[i]);
    printf("\n========================================\n\n");

    LL c,p;
    while(cin>>c>>p)
    {
        LLL sum=0;
        LLL b=tot*p;
//        for(int i=1;i<=N;i++)
//            sum+=cnt[i]*qpow(c,i);
//        sum/=tot;
//        cout<<(LL)(sum%p)<<endl;
        for(int i=1;i<=N;i++)
            sum=(sum+cnt[i]*qpow(c,i,b))%b;
        sum/=tot;
        cout<<(LL)sum<<endl;
    }
}
时间: 2024-08-12 23:06:25

2017 ACM区域赛现场赛 青岛站 E (polya计数)的相关文章

HDU 4791 Alice&#39;s Print Service(2013长沙区域赛现场赛A题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4791 解题报告:打印店提供打印纸张服务,需要收取费用,输入格式是s1 p1 s2 p2 s3 p3...表示打印区间s1到s2张纸的单价是p1,打印区间s2 到s3的单价是p2....最后是sn到无穷大的单价是pn,让你求打印k张纸的总费用最少是多少?有m次查询. 因为s1*p1 > s2 * p2 > s3*p3......,很显然,加入k所在的那个区间是第x个区间,那么最低费用要么是k * p

13杭州区域赛现场赛Rabbit Kingdom(树状数组+离线)

题意:给你一个长度数列,再给你m个询问(一个区间),问你在这个区间里面有多少个数与其他的数都互质. 解题思路:你看这种类型的题目都可以肯定这是 离线+树状数组(线段树).主要就是他的更新信息.这里我的处理是先把1-200000(每个数的范围)数里面所有的质因子求出来.然后从后往前遍历数组.会出现以下几种情况 1.a[k]的质因子在后面出现过而[更新标记] 和[被更新标记] 都为假 2.a[k]的质因子在后面出现过的那个位置 I   [更新标记]为 真 . 3.a[k]的质因子在后面出现过且那个位

2013 ACM/ICPC 长沙现场赛 A题 - Alice&#39;s Print Service (ZOJ 3726)

Alice's Print Service Time Limit: 2 Seconds      Memory Limit: 65536 KB Alice is providing print service, while the pricing doesn't seem to be reasonable, so people using her print service found some tricks to save money. For example, the price when

2017 ACM区域赛(南宁站) 参赛流水账

day0: 早上四点起床赶飞机,还好没有吵醒室友导致被打死.本来想在飞机上准备一下下周的小测,结果飞机一点都不平稳,只能全程和队友吹逼聊天.下午在宾馆里和johann通关了一部合金弹头,重温了童年的经典.晚上补了补前一天晚上的CF educationnal round的E题和F题,然后被彪爷拉去开黑打牛客网的一个比赛,一看比赛都已经开始2小时了,不过彪爷实力稳如狗,我写了个D题,他写了ABCE,最后rank 9,要是早点参加就可以骗到奖金了QAQ.  打完比赛逛逛B站发现fgo出了一个剧场版动画

2014年北京赛区区域赛现场赛A,D,H,I,K题解(hdu5112,5115,5119,5220,5122)

转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud 下午在HDU上打了一下今年北京区域赛的重现,过了5题,看来单挑只能拿拿铜牌,呜呜. 先将这五题的题解放上来,剩余题目等搞出来再补上 A题 A Curious Matt Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Others) Problem Description T

ACM/ICPM2014鞍山现场赛D Galaxy (HDU 5073)

题目链接:pid=5073">http://acm.hdu.edu.cn/showproblem.php?pid=5073 题意:给定一条线上的点,然后能够去掉当中的m个,使剩下的到重心的距离最小, 因为重心等于距离的平均值.因此也就是求方差最小. 分析: 由于要去掉m个所以一定剩下n-m个,我们枚举这一串点的起始位置从1開始 一直枚举到m, 然后由平方和的公式展开.预处理一下前几项平方和.以及前几项的和就可以,复杂度为O(N); 代码例如以下: #include <iostream

HDU 4793 Collision(2013长沙区域赛现场赛C题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4793 解题报告:在一个平面上有一个圆形medal,半径为Rm,圆心为(0,0),同时有一个圆形范围圆心也是(0,0),半径为R,R > Rm,现在向平面上投掷一枚硬币,硬币初始的圆心位置为(x,y),半径是r,给出硬币的速度向量,硬币碰到medal的时候会反射,注意,反射就是原路返回,并不是按照常理的按照圆心连线的路线,表示一直以为是这样,WA了很久,然后,让你求硬币跟圆形范围有交集的时候的总时间是

13南京区域赛现场赛 题目重演 解题报告

A.GPA(HDU4802): 纯属进入状态用,给你一些字符串对应的权重,求加权平均,如果是N,P不计入统计 GPA Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1193    Accepted Submission(s): 743 Problem Description In college, a student may take

2013 ACM/ICPC 长沙现场赛 C题 - Collision (ZOJ 3728)

Collision Time Limit: 2 Seconds      Memory Limit: 65536 KB      Special Judge There's a round medal fixed on an ideal smooth table, Fancy is trying to throw some coins and make them slip towards the medal to collide. There's also a round range which