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 ...
随机推荐
- VS2012下使用Moq进行单元测试
单元测试虽然是个很老的东西了,但平时写代码一般都不写测试,因为VS调试完全可以满足了,所以一直也就没有用过,刚好在<Pro.ASP.NET.MVC.3.Framework>中看到了Moq这 ...
- CSS案例
1.美团网效果 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> ...
- 免费的Visual Studio的插件
在做了深入(的)研究之后(通过在google网站搜索),,我编译了15个免费Visual Studio 2005插件表..其中一些插件将提高您(的)代码(的)质量,,另外一些能使您编译(的)更快,,但 ...
- hdu 1068
找出没有缘分的同学,如果有缘分的建边, 就是求最大独立集问题了 #include<stdio.h> #include<string.h> int n,m,ma[1050][10 ...
- 提高你的Java代码质量吧:不要让类型默默转换
一.分析 在Java运算中的类型转换,是先运算在进行类型转换的.具体场景如下. 二.场景 在如下程序中: public class Client{ public static final int ...
- POJ 2409 Let it Bead 组合数学
题目地址: http://poj.org/problem?id=2409 给你一串珠子有m个,用n种不同的颜色涂色,问有多少种分法. 用polay定理求解,对于排成一排的带编号的小球,按照某一种方案改 ...
- android中使用Http下载文件并保存到本地SD卡
1.AndroidMainfest.xml中设置权限 <uses-permission android:name="android.permission.INTERNET"& ...
- 使用CATransformLayer制作3D图像和动画
之前我们讲过可以用CALayer搭配CATransform3D来实现将View做3D旋转, 今天我们再看一个3D的新东西 CATransformLayer, 看名字就知道这个layer跟旋转有关, 那 ...
- Python高手之路【十二】面向对象设计模式
单例模式 单例,顾名思义单个实例. class Person: __instance = None def __init__(self): pass @staticmethod def getInst ...
- 读《不要告诉我你懂margin(海玉的博客)》有感
原文来自海玉的博客:http://www.hicss.net/do-not-tell-me-you-understand-margin/ [个人想法] 1."这个问题发生的原因是根据规范,一 ...
题目链接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 ...
单元测试虽然是个很老的东西了,但平时写代码一般都不写测试,因为VS调试完全可以满足了,所以一直也就没有用过,刚好在<Pro.ASP.NET.MVC.3.Framework>中看到了Moq这 ...
1.美团网效果 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> ...
在做了深入(的)研究之后(通过在google网站搜索),,我编译了15个免费Visual Studio 2005插件表..其中一些插件将提高您(的)代码(的)质量,,另外一些能使您编译(的)更快,,但 ...
找出没有缘分的同学,如果有缘分的建边, 就是求最大独立集问题了 #include<stdio.h> #include<string.h> int n,m,ma[1050][10 ...
一.分析 在Java运算中的类型转换,是先运算在进行类型转换的.具体场景如下. 二.场景 在如下程序中: public class Client{ public static final int ...
题目地址: http://poj.org/problem?id=2409 给你一串珠子有m个,用n种不同的颜色涂色,问有多少种分法. 用polay定理求解,对于排成一排的带编号的小球,按照某一种方案改 ...
1.AndroidMainfest.xml中设置权限 <uses-permission android:name="android.permission.INTERNET"& ...
之前我们讲过可以用CALayer搭配CATransform3D来实现将View做3D旋转, 今天我们再看一个3D的新东西 CATransformLayer, 看名字就知道这个layer跟旋转有关, 那 ...
单例模式 单例,顾名思义单个实例. class Person: __instance = None def __init__(self): pass @staticmethod def getInst ...
原文来自海玉的博客:http://www.hicss.net/do-not-tell-me-you-understand-margin/ [个人想法] 1."这个问题发生的原因是根据规范,一 ...