HDU 5868 Different Circle Permutation(burnside 引理)
HDU 5868 Different Circle Permutation(burnside 引理)
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5868
Description
You may not know this but it's a fact that Xinghai Square is Asia's largest city square. It is located in Dalian and, of course, a landmark of the city. It's an ideal place for outing any time of the year. And now:
There are N children from a nearby primary school flying kites with a teacher. When they have a rest at noon, part of them (maybe none) sit around the circle flower beds. The angle between any two of them relative to the center of the circle is always a multiple of 2π/N but always not 2π/N.
Now, the teacher raises a question: How many different ways there are to arrange students sitting around the flower beds according to the rule stated above. To simplify the problem, every student is seen as the same. And to make the answer looks not so great, the teacher adds another specification: two ways are considered the same if they coincide after rotating.
Input
There are T tests (T≤50). Each test contains one integer N. 1≤N≤1000000000 (10^9). Process till the end of input.
Output
For each test, output the answer mod 1000000007 (10^9+7) in one line.
Sample Input
4
7
10
Sample Output
3
5
15
题意:
有n个人假设完全一样,其中有一部分人坐成一个圆,这些人中任意两个人之间的距离是2π/N的倍数,但是不是2π/N。如果有两种坐法,一种通过旋转可以变成另外一种坐法,我们就可以认为这是一种坐法,问总共有多少种坐法?
题解:
题解参照https://async.icpc-camp.org/d/546-2016 先膜一发菊苣。
首先是不考虑旋转同构的情况下,我们自己手动推几个就可以得到一个公式就是f(n)=f(n-1)+f(n-2)。这里我们注意一点,就是当n=1的时候我们当其为1 。(具体原因我也不清楚)。
然后就是我们使用 burnside 引理(对于一个置换f,若一个着色方案s经过置换后不变,称s为f的不动点。将f的不动点数目记为C(f),则可以证明等价类数目为所有C(f)的平均值。此结论称为 burnside 引理————来自训练指南)。
下面则是求不动点数目。对于这个我们则是依次计算旋转1,2,……n的不动点数目。前面我们定义了f(n)为不考虑旋转同构的状态。下面就是将循环数代入即可,其中循环节的个数为gcd(i,n)。
当然直枚举每个点必然会超时。我们可以使用 (∑f(d)*φ(n/d))/n 代替。其中d是n的因子。
代码:
#include <bits/stdc++.h>
using namespace std;
const long long mod = 1e9+7 ;
struct matrix {
long long x1,x2 ;
long long x3,x4 ;
};
matrix mul(matrix a,matrix b){
matrix ans ;
ans.x1 = (a.x1*b.x1 + a.x2*b.x3)%mod ;
ans.x2 = (a.x1*b.x2 + a.x2*b.x4)%mod ;
ans.x3 = (a.x3*b.x1 + a.x4*b.x3)%mod ;
ans.x4 = (a.x3*b.x2 + a.x4*b.x4)%mod ;
return ans ;
}
long long quick_matrix(long long x){
x -= 4 ;
matrix ans,cal ;
ans.x1 = ans.x2 = ans.x3 = 1 ; ans.x4 = 0 ;
cal.x1 = cal.x2 = cal.x3 = 1 ; cal.x4 = 0 ;
while (x){
if (x%2)
ans = mul(ans,cal) ;
cal = mul(cal,cal) ;
x >>= 1 ;
}
return (ans.x1*4+ans.x2*3)%mod ;
}
long long fx(long long x){
if (x == 1)
return 1;
else if (x == 2)
return 3;
else if (x == 3)
return 4;
else return quick_matrix(x) ;
}
long long quick(long long a,long long n){
long long ans = 1 ;
long long cal = a ;
while (n){
if (n%2)
ans = (ans*cal)%mod ;
cal = (cal*cal)%mod;
n >>= 1;
}
return ans ;
}
long long euler(long long n)
{
long long ans = n;
long long i;
for (i = 2; i*i <= n; i++){
if (n%i == 0){
while (n%i == 0)
n /= i;
ans = ans/i*(i-1) ;
}
}
if (n != 1)
ans = ans/n*(n-1);
return ans;
}
long long solve(long long n){
if (n == 1)
return 2;
long long ans = 0;
long long nn = n ;
long long d;
long long i;
for (i = 1; i*i < n; i++){
if (n%i == 0){
ans = (ans + fx(i)*euler(nn/i) + fx(nn/i)*euler(i))%mod ;
}
}
if (i*i == n)
ans = (ans + fx(i)*euler(i))%mod ;
return (ans*quick(nn,mod-2))%mod;
}
int main()
{
long long n;
while (~scanf("%lld",&n))
printf("%lld\n",solve(n)) ;
return 0 ;
}
HDU 5868 Different Circle Permutation(burnside 引理)的更多相关文章
- HDU 5868 Different Circle Permutation Burnside引理+矩阵快速幂+逆元
题意:有N个座位,人可以选座位,但选的座位不能相邻,且旋转不同构的坐法有几种.如4个座位有3种做法.\( 1≤N≤1000000000 (10^9) \). 题解:首先考虑座位不相邻的选法问题,如果不 ...
- 解题:HDU 5868 Different Circle Permutation
题面 先往上套Burnside引理 既然要求没有$\frac{2*π}{n}$的角,也就是说两个人不能挨着,那么相当于给一个环黑白染色,两个相邻的点不能染白色,同时求方案数.考虑$n$个置换子群,即向 ...
- hdu 5868:Different Circle Permutation 【Polya计数】
似乎是比较基础的一道用到polya定理的题,为了这道题扣了半天组合数学和数论. 等价的题意:可以当成是给正n边形的顶点染色,旋转同构,两种颜色,假设是红蓝,相邻顶点不能同时为蓝. 大概思路:在不考虑旋 ...
- HDU 5868 Different Circle Permutation
公式,矩阵快速幂,欧拉函数,乘法逆元. $an{s_n} = \frac{1}{n}\sum\limits_{d|n} {\left[ {phi(\frac{n}{d})×\left( {fib(d ...
- hdu 5868 2016 ACM/ICPC Asia Regional Dalian Online 1001 (burnside引理 polya定理)
Different Circle Permutation Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 262144/262144 K ...
- hdu 5868 Polya计数
Different Circle Permutation Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 262144/262144 K ...
- 【等价的穿越】Burnside引理&Pólya计数法
Problem 起源: SGU 294 He's Circle 遗憾的是,被吃了. Poj有道类似的: Mission 一个长度为n(1≤n≤24)的环由0,1,2组成,求有多少本质不同的环. 实际上 ...
- [bzoj 1004][HNOI 2008]Cards(Burnside引理+DP)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1004 分析: 1.确定方向:肯定是组合数学问题,不是Polya就是Burnside,然后题目上 ...
- POJ 2888 Magic Bracelet(Burnside引理,矩阵优化)
Magic Bracelet Time Limit: 2000MS Memory Limit: 131072K Total Submissions: 3731 Accepted: 1227 D ...
随机推荐
- WPF制作的小型笔记本
WPF制作的小型笔记本-仿有道云笔记 楼主所在的公司不允许下载外部资源, 不允许私自安装应用程序, 平时记录东西都是用记事本,时间久了很难找到以前记的东西. 平时在家都用有道笔记, 因此就模仿着做了一 ...
- reading words in your computer and changing to female voice, linux festival text2wave saving wav files
on a brand new linux PC, e.g. ubuntu 14.04 amd64 To hear voice sudo apt-get install festival -y then ...
- TOGAF架构内容框架之内容元模型(上)
TOGAF架构内容框架之内容元模型(上) 2. 内容元模型(Content Metamodel) 在TOGAF的眼中,企业架构是以一系列架构构建块为基础的,并将目录.矩阵和图形作为其具体展现方式.如果 ...
- 从struts2拦截器到自定义拦截器
拦截器可谓struts2的核心了,最基本的bean的注入就是通过默认的拦截器实现的,一般在struts2.xml的配置中,package内直接或间接继承了struts-default.xml,这样st ...
- 成都传智播客JDBC视频及讲师介绍
成都传智播客java讲师,也许,你跟他很熟,你或者听过他的课,或者跟他争论过什么,又或者你们在一起共事,再者你们只是偶尔擦肩而过.在小编的印象中郭老师完全没有架子,和他相处会让你觉得不是面对一个老师, ...
- TCP中ECN的工作原理分析二(摘自:RFC3168)
英文源:http://www.icir.org/floyd/ecn.html 发送端和接收端处理: The TCP Sender For a TCP connection using ECN, new ...
- siverlight 后台动态设置图片路径的总结
最近碰到了个问题,需要给一个用户控件中的image动态设置图片资源 1.图片资源属性为resource时,静态引用无任何问题,但是动态设置时,就什么也不显示 后来找到问题所在, 必须把此图片属性项中“ ...
- hdu 1559 最大子矩阵(DP)
题目链接:点击链接 #include<stdio.h> #include<string.h> #define max(a,b) a>b?a:b int d[1005][1 ...
- UVa1003-Cutting sticks
试题描述 将一段木棒按要求切割,每次切割都要付出与木棒长度相同的代价,求最小代价切割. (多组数据) 输入描述 长度L. 切割点数n(n<=50). n个切割点. 输出描述 "The ...
- Oracle笔记(六) 多表查询
最近看了李兴华的oracle视频,这是网上别人做的笔记非常细致,分享给大家,第六篇 原创地址:http://www.cnblogs.com/mchina/archive/2012/09/07/2651 ...
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5868
Description
You may not know this but it's a fact that Xinghai Square is Asia's largest city square. It is located in Dalian and, of course, a landmark of the city. It's an ideal place for outing any time of the year. And now:
There are N children from a nearby primary school flying kites with a teacher. When they have a rest at noon, part of them (maybe none) sit around the circle flower beds. The angle between any two of them relative to the center of the circle is always a multiple of 2π/N but always not 2π/N.
Now, the teacher raises a question: How many different ways there are to arrange students sitting around the flower beds according to the rule stated above. To simplify the problem, every student is seen as the same. And to make the answer looks not so great, the teacher adds another specification: two ways are considered the same if they coincide after rotating.
Input
There are T tests (T≤50). Each test contains one integer N. 1≤N≤1000000000 (10^9). Process till the end of input.
Output
For each test, output the answer mod 1000000007 (10^9+7) in one line.
Sample Input
4
7
10
Sample Output
3
5
15
题意:
有n个人假设完全一样,其中有一部分人坐成一个圆,这些人中任意两个人之间的距离是2π/N的倍数,但是不是2π/N。如果有两种坐法,一种通过旋转可以变成另外一种坐法,我们就可以认为这是一种坐法,问总共有多少种坐法?
题解:
题解参照https://async.icpc-camp.org/d/546-2016 先膜一发菊苣。
首先是不考虑旋转同构的情况下,我们自己手动推几个就可以得到一个公式就是f(n)=f(n-1)+f(n-2)。这里我们注意一点,就是当n=1的时候我们当其为1 。(具体原因我也不清楚)。
然后就是我们使用 burnside 引理(对于一个置换f,若一个着色方案s经过置换后不变,称s为f的不动点。将f的不动点数目记为C(f),则可以证明等价类数目为所有C(f)的平均值。此结论称为 burnside 引理————来自训练指南)。
下面则是求不动点数目。对于这个我们则是依次计算旋转1,2,……n的不动点数目。前面我们定义了f(n)为不考虑旋转同构的状态。下面就是将循环数代入即可,其中循环节的个数为gcd(i,n)。
当然直枚举每个点必然会超时。我们可以使用 (∑f(d)*φ(n/d))/n 代替。其中d是n的因子。
代码:
#include <bits/stdc++.h>
using namespace std;
const long long mod = 1e9+7 ;
struct matrix {
long long x1,x2 ;
long long x3,x4 ;
};
matrix mul(matrix a,matrix b){
matrix ans ;
ans.x1 = (a.x1*b.x1 + a.x2*b.x3)%mod ;
ans.x2 = (a.x1*b.x2 + a.x2*b.x4)%mod ;
ans.x3 = (a.x3*b.x1 + a.x4*b.x3)%mod ;
ans.x4 = (a.x3*b.x2 + a.x4*b.x4)%mod ;
return ans ;
}
long long quick_matrix(long long x){
x -= 4 ;
matrix ans,cal ;
ans.x1 = ans.x2 = ans.x3 = 1 ; ans.x4 = 0 ;
cal.x1 = cal.x2 = cal.x3 = 1 ; cal.x4 = 0 ;
while (x){
if (x%2)
ans = mul(ans,cal) ;
cal = mul(cal,cal) ;
x >>= 1 ;
}
return (ans.x1*4+ans.x2*3)%mod ;
}
long long fx(long long x){
if (x == 1)
return 1;
else if (x == 2)
return 3;
else if (x == 3)
return 4;
else return quick_matrix(x) ;
}
long long quick(long long a,long long n){
long long ans = 1 ;
long long cal = a ;
while (n){
if (n%2)
ans = (ans*cal)%mod ;
cal = (cal*cal)%mod;
n >>= 1;
}
return ans ;
}
long long euler(long long n)
{
long long ans = n;
long long i;
for (i = 2; i*i <= n; i++){
if (n%i == 0){
while (n%i == 0)
n /= i;
ans = ans/i*(i-1) ;
}
}
if (n != 1)
ans = ans/n*(n-1);
return ans;
}
long long solve(long long n){
if (n == 1)
return 2;
long long ans = 0;
long long nn = n ;
long long d;
long long i;
for (i = 1; i*i < n; i++){
if (n%i == 0){
ans = (ans + fx(i)*euler(nn/i) + fx(nn/i)*euler(i))%mod ;
}
}
if (i*i == n)
ans = (ans + fx(i)*euler(i))%mod ;
return (ans*quick(nn,mod-2))%mod;
}
int main()
{
long long n;
while (~scanf("%lld",&n))
printf("%lld\n",solve(n)) ;
return 0 ;
}
题意:有N个座位,人可以选座位,但选的座位不能相邻,且旋转不同构的坐法有几种.如4个座位有3种做法.\( 1≤N≤1000000000 (10^9) \). 题解:首先考虑座位不相邻的选法问题,如果不 ...
题面 先往上套Burnside引理 既然要求没有$\frac{2*π}{n}$的角,也就是说两个人不能挨着,那么相当于给一个环黑白染色,两个相邻的点不能染白色,同时求方案数.考虑$n$个置换子群,即向 ...
似乎是比较基础的一道用到polya定理的题,为了这道题扣了半天组合数学和数论. 等价的题意:可以当成是给正n边形的顶点染色,旋转同构,两种颜色,假设是红蓝,相邻顶点不能同时为蓝. 大概思路:在不考虑旋 ...
公式,矩阵快速幂,欧拉函数,乘法逆元. $an{s_n} = \frac{1}{n}\sum\limits_{d|n} {\left[ {phi(\frac{n}{d})×\left( {fib(d ...
Different Circle Permutation Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 262144/262144 K ...
Different Circle Permutation Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 262144/262144 K ...
Problem 起源: SGU 294 He's Circle 遗憾的是,被吃了. Poj有道类似的: Mission 一个长度为n(1≤n≤24)的环由0,1,2组成,求有多少本质不同的环. 实际上 ...
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1004 分析: 1.确定方向:肯定是组合数学问题,不是Polya就是Burnside,然后题目上 ...
Magic Bracelet Time Limit: 2000MS Memory Limit: 131072K Total Submissions: 3731 Accepted: 1227 D ...
WPF制作的小型笔记本-仿有道云笔记 楼主所在的公司不允许下载外部资源, 不允许私自安装应用程序, 平时记录东西都是用记事本,时间久了很难找到以前记的东西. 平时在家都用有道笔记, 因此就模仿着做了一 ...
on a brand new linux PC, e.g. ubuntu 14.04 amd64 To hear voice sudo apt-get install festival -y then ...
TOGAF架构内容框架之内容元模型(上) 2. 内容元模型(Content Metamodel) 在TOGAF的眼中,企业架构是以一系列架构构建块为基础的,并将目录.矩阵和图形作为其具体展现方式.如果 ...
拦截器可谓struts2的核心了,最基本的bean的注入就是通过默认的拦截器实现的,一般在struts2.xml的配置中,package内直接或间接继承了struts-default.xml,这样st ...
成都传智播客java讲师,也许,你跟他很熟,你或者听过他的课,或者跟他争论过什么,又或者你们在一起共事,再者你们只是偶尔擦肩而过.在小编的印象中郭老师完全没有架子,和他相处会让你觉得不是面对一个老师, ...
英文源:http://www.icir.org/floyd/ecn.html 发送端和接收端处理: The TCP Sender For a TCP connection using ECN, new ...
最近碰到了个问题,需要给一个用户控件中的image动态设置图片资源 1.图片资源属性为resource时,静态引用无任何问题,但是动态设置时,就什么也不显示 后来找到问题所在, 必须把此图片属性项中“ ...
题目链接:点击链接 #include<stdio.h> #include<string.h> #define max(a,b) a>b?a:b int d[1005][1 ...
试题描述 将一段木棒按要求切割,每次切割都要付出与木棒长度相同的代价,求最小代价切割. (多组数据) 输入描述 长度L. 切割点数n(n<=50). n个切割点. 输出描述 "The ...
最近看了李兴华的oracle视频,这是网上别人做的笔记非常细致,分享给大家,第六篇 原创地址:http://www.cnblogs.com/mchina/archive/2012/09/07/2651 ...