[POJ2888] Magic Bracelet

[POJ2888] Magic Bracelet

题目描述

简要题意:给圆上n个点染色,颜色有m种,其中k对颜色不能相邻,循环同构,多组数据,询问染色方案数。

 

Solution

大概就是一道挺显然的Burnside题(一般染色,循环同构都酱紫做)。

对于一个圆上的循环同构,显然有n个置换,用Burnside引理求解答案:

|G||X/G|=\sum_{g\in G}|X^{g}|

所以我们可以枚举置换中的循环个数x,令  solve(x)  为不考虑循环同构时,x个点m种颜色,满足所有限制的方案数,最后

Ans=\sum solve(i)*\phi(\frac{n}{i})

现在的问题转化为,如何求出  solve(x),这是一个经典问题,可以DP解决。

f[i][j] 为线段上i个点,第i个点的颜色为j,满足其他所有限制的方案数。

f[i][j]+=f[i-1][k]\;\;\;\;\;\;\;\;\;\;(flag[j][k]=1) 

这样的DP是  O(nm^2),直接矩阵乘法优化成  O(m^3\lg n) 。

最后的时间复杂度大概是——  O(\sqrt{n}\;m^3\lg n)。(实测需要卡常,实际速度和POJ测评机有关)

#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <ctime>
#include <cassert>
#include <string.h>
//#include <unordered_set>
//#include <unordered_map>
//#include <bits/stdc++.h>#define MP(A,B) make_pair(A,B)
#define PB(A) push_back(A)
#define SIZE(A) ((int)A.size())
#define LEN(A) ((int)A.length())
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define fi first
#define se secondusing namespace std;template<typename T>inline bool upmin(T &x,T y) { return y<x?x=y,1:0; }
template<typename T>inline bool upmax(T &x,T y) { return x<y?x=y,1:0; }typedef long long ll;
typedef unsigned long long ull;
typedef long double lod;
typedef pair<int,int> PR;
typedef vector<int> VI;const lod eps=1e-11;
const lod pi=acos(-1);
const int oo=1<<30;
const ll loo=1ll<<62;
const int mods=9973;
const int MAXN=1000005;
const int INF=0x3f3f3f3f;//1061109567
/*--------------------------------------------------------------------*/
inline int read()
{int f=1,x=0; char c=getchar();while (c<'0'||c>'9') { if (c=='-') f=-1; c=getchar(); }while (c>='0'&&c<='9') { x=(x<<3)+(x<<1)+(c^48); c=getchar(); }return x*f;
}
int flag[MAXN],phi[MAXN],prime[MAXN],pnum=0,n,m,k;
int Phi(int x)
{int cnt=x;if (x<=1e6) return phi[x];for (int i=1;prime[i]*prime[i]<=x;i++)if (!(x%prime[i])){cnt=cnt-cnt/prime[i];while (!(x%prime[i])) x/=prime[i];}return (x>1)?cnt-cnt/x:cnt;
}
void Init_Prime(int n)
{flag[1]=phi[1]=1; for (int i=2;i<=n;i++){if (!flag[i]) prime[++pnum]=i,phi[i]=i-1;for (int j=1;j<=pnum&&prime[j]*i<=n;j++){flag[prime[j]*i]=1;if (!(i%prime[j])) { phi[prime[j]*i]=phi[i]*prime[j]; break; }phi[prime[j]*i]=phi[i]*phi[prime[j]];}}
}
int upd(int x,int y){ return x+y>=mods?x+y-mods:x+y; }
struct Matrix 
{int n,A[10][10];Matrix(int n1=0) {n=n1;memset(A,0,sizeof A); }void Init() { memset(A,0,sizeof A); }void init() { for(int i=0;i<n;i++) A[i][i]=1; }Matrix operator * (const Matrix &b){Matrix ans(n);for(int i=0;i<n;i++) for(int j=0;j<n;j++) for(int k=0;k<n;k++) ans.A[i][k]=upd(ans.A[i][k],A[i][j]*b.A[j][k]%mods);return ans;}Matrix operator ^ (const ll &b)  {Matrix ret(n),x=*this; ret.init();for (ll y=b;y;y>>=1) {if (y&1) ret=ret*x;x=x*x;}return ret;}void print(){for (int i=0;i<n;i++){for (int j=0;j<n;j++) cout<<setw(4)<<A[i][j];cout<<endl;}cout<<endl;}
} f,g;
int getans(int x)
{g=f^x;ll ans=0;for (int i=0;i<m;i++) ans+=g.A[i][i];return ans;
}
int solve(int x,int y)
{if (y==0) return 1;int q=solve(x,y>>1);return (y&1)?1ll*q*q%mods*x%mods:1ll*q*q%mods;
}
int main()
{Init_Prime(1000000);cout<<Phi(1000000000)<<endl;int Case=read();while (Case--){n=read(),m=read(),k=read();f.n=m;for (int i=0;i<m;i++)for (int j=0;j<m;j++) f.A[i][j]=1;for (int i=1;i<=k;i++) {int x=read()-1,y=read()-1;f.A[x][y]=0;f.A[y][x]=0;}ll ans=0;for (int i=1;i*i<=n;i++)if (n%i==0){ans=upd(ans,1ll*Phi(n/i)*getans(i)%mods);if (i*i!=n) ans=upd(ans,1ll*Phi(i)*getans(n/i)%mods);
//			cout<<ans<<endl;}printf("%d\n",1ll*ans*solve(n,mods-2)%mods);}return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/315821.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手写编译器

假期没事想搞搞编译器&#xff0c;但学校课程未教过编译原理&#xff0c;自己只好在b站看了stanford的CS143《编译原理》&#xff0c;并结合相关资料&#xff0c;打算寒假期间自己手写一个简易的编译器 ReactjsbootStrap开发自制编译语言Monkey的编译器&#xff1a;创建简易的页…

使用命令行导出 SQL Server 数据层应用程序

点击上方蓝字关注“汪宇杰博客”我们可以使用 SSMS 导出 SQL Server 数据库的数据层应用程序。我在本地机器上使用这种方法已经有好几年了。如果不知道什么是 DAC&#xff0c;您可以参考 Microsoft 文档&#xff1a;https://docs.microsoft.com/en-us/sql/relational-databases…

Codeforces 1065 E. Side Transmutations

Codeforces 1065 E. Side Transmutations 题目描述 题意&#xff1a;一个字符串长度为&#xff0c;字符集大小为 &#xff0c;再给出种交换方式&#xff0c;表示可以交换。如果两个不同的串能够通过任意的交换方式得到相同的串&#xff0c;则视为相同&#xff0c;求方案数。…

P1 用reactjs和bootstrap创建页面IDE

文章目录页面IDE展示&#xff1a;要求&#xff1a;安装好Node.jsreactjs组件化开发页面IDE展示&#xff1a; 要求&#xff1a; 希望能够达到eclipse辅助编程的功能 关键字提醒&#xff0c;高亮 1&#xff0c; 有类似C语言的语法结构 2&#xff0c; 支持变量绑定 3&#xff0c;…

所以Apache基金会不受美国法律约束?

开源中国昨天发布的一篇文章《开源界也要注意&#xff0c;Apache 基金会与 GitHub 都受美国法律约束》引发了开源届乃至整个 IT 行业的热烈讨论&#xff0c;其中有个别声音认为文章的说法有误&#xff0c;甚至制造了恐慌。文中我们引用了两处内容&#xff0c;分别是 Apache 软件…

Loj#6485. LJJ 学二项式定理

Loj#6485. LJJ 学二项式定理&#xff08;单位根反演&#xff09; 题目描述 题目描述 题意&#xff1a;求下面式子的答案QAQ。 [∑((ni)⋅si⋅aimod4)]mod998244353[\sum(\tbinom{n}{i}\cdot s^i \cdot a_{i\;\;mod\;\;4}) ]\;mod\;\;998244353 [∑((in​)⋅si⋅aimod4​)]mod…

团体程序设计天梯赛-练习集

团体程序设计天梯赛-练习集 L2-001 紧急救援 (25 分) 知识点&#xff1a;最短路dij #include<bits/stdc.h> #define debug(x,y) printf("%s %d\n",x,y); typedef long long ll; using namespace std; inline int read(){int s0,w1;char chgetchar();while(…

C#中的Explicit和Implicit了解一下吧

今天在研究公司项目框架的时候看到了下面的用法&#xff0c;public static implicit operator JsonData(int data);。貌似很久没用过这种隐式转换的写法了&#xff0c;因此重新温习一下C#中转换相关的知识。作者&#xff1a;依乐祝原文地址&#xff1a;https://www.cnblogs.com…

bzoj#2125. 最短路

bzoj#2125. 最短路 题目描述 Description 给一个N个点M条边的连通无向图&#xff0c;满足每条边最多属于一个环&#xff0c;有Q组询问&#xff0c;每次询问两点之间的最短路径。 Input 输入的第一行包含三个整数&#xff0c;分别表示N和M和Q 下接M行&#xff0c;每行三个整数v…

Dapper的正确使用姿势

本文demo适用于MySQL优点高性能、易排查、易运维、灵活可控缺点和EF相比&#xff0c;手写sql当修改表结构不易发现bug。习惯了EF后再来使用Dapper&#xff0c;会很难适应那种没有了强类型的安全感。不过可以用单元测和心细来避免。问题&#xff1a;IDbConnection需不需要手动Op…

P4064 [JXOI2017]加法

P4064 [JXOI2017]加法 题意&#xff1a; 题解&#xff1a; 要求找最小值尽可能大&#xff0c;很明显二分&#xff0c;现在是如何判断二分出来的答案的正确性 对于一个二分出来的答案mid&#xff0c;要求对k个区间进行操作后&#xff0c;最小值大于mid&#xff0c;我们可以这…

[NewLife.XCode]百亿级性能

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;支持nfx/netcore&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中&#xff0c;代…

LuoguP4606 [SDOI2018]战略游戏

LuoguP4606 [SDOI2018]战略游戏 题目描述 题目描述 省选临近&#xff0c;放飞自我的小 QQ 无心刷题&#xff0c;于是怂恿小 CC 和他一起颓废&#xff0c;玩起了一款战略游戏。 这款战略游戏的地图由 nn 个城市以及 mm 条连接这些城市的双向道路构成&#xff0c;并且从任意一个…

Jozky 刷题目录

文章目录本目录参考OI-Wiki还未解决专区算法基础枚举模拟递归&分治贪心排序前缀和&差分二分倍增构造搜索DFS && BFS双向搜索启发式搜索A*迭代加深搜索IDA*回溯法Dancing Links搜索优化&#xff08;剪枝&#xff09;动态规划普通dp背包dp区间dpDAG上的dp树形dp状…

Web API 速率限制(一)

导读当您API有大量消费者或者请求量猛增到影响程序可用性的时候&#xff0c;您可能需要对API进行速率限制。所以对API进行限速的在于&#xff1a;在增加可靠性和可用性的同时来保护基础架构&#xff0c;你不希望某个恶意的API消费者或者差劲的API客户端开发者通过Dos攻击把你的…

训练赛合集

带 # 的为未补 带△的为未补完 带※的为补不动 比赛合集 牛客 △2021年度训练联盟热身训练赛第一场 Codeforces Codeforces Round #694 Div. 2 △Codeforces Round #695 (Div. 2) Codeforces Round #696 (Div. 2) △CodeCraft-21 and Codeforces Round #711 (Div. 2) Codef…

构建简单的微服务架构

前言 本篇仅作引导&#xff0c;内容较多&#xff0c;如果阅读不方便&#xff0c;可以使用电脑打开我们的文档官网进行阅读。如下图所示&#xff1a;文档官网地址&#xff1a;docs.xin-lai.com目录总体介绍微服务架构的好处 微服务架构的不足&#xff08;这个时候…

[AGC026D]Histogram Coloring

[AGC026D]Histogram Coloring 题目描述 题面 题意大概是有一个nnn列网格图&#xff0c;给定一个长度为nnn的序列hih_ihi​&#xff0c;第iii列只保留这一列最下面的hih_ihi​个格子。 现在需要给这些保留下来的格子染成红色或蓝色&#xff0c;满足每一个完整的222222正方形…

每日训练赛

文章目录说明2021.9.242021.9.252021.9.262021.9.272021.9.282021.9.292021.9.302021.10.12021.10.22021.10.32021.10.42021.10.52021.10.62021.10.72021.10.82021.10.92021.10.132021.10.152021.10.162021.10.212021.10.222021.10.242021.10.252021.10.262021.10.29说明 记录…

读《代码整洁之道》

什么是整洁代码代码的质量非常重要&#xff0c;糟糕的代码有可能会毁了一个公司。对于一个很注重代码质量的人来说呆在一个只关注交付而不关注代码质量的公司是很痛苦的。什么是整洁的代码&#xff0c;不同的人又不同的定义。我认为整洁的代码应该是符合所使用语言代码规范的&a…