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 ...
随机推荐
- php5.3.*编译出现make: *** [ext/gd/libgd/gd_compat.lo] Error 1 解决方法
升级系统,把php5.2.9升级到5.3.6,按照以前的编译参数,configure能正常通过,但是在make的时候提示: In file included from /root/php-5.3.6 ...
- 【Oracle】-【体系结构】-【DBWR】-DBWR进程相关理解
对DBWR的一些理解 首先从名称上,DBWR全称是Database Writer Process,属于Oracle后台进程的一种,有的地方也叫DBWn,我想这里是出于DBWR进程个数的原因,DBWR进 ...
- 重复弹Toast的解决方案
虽然网上有很多了,还是记录一下吧, 解决思路:不用计算Toast的时间之类的,就是定义一个全局的成员变量Toast, 这个Toast不为null的时候才去make,否则直接setText.为了按返回键 ...
- apache cxf笔记之Spring客户端访问和调用webservice服务
继续上次的spring服务的问题,这边介绍一种spring配置客户端的方法. 1.src目录下新建client-beans.xml文件 <?xml version="1.0" ...
- LAMP编译安装遇到的问题
apache安装 1, no SSL-C headers found configure: error: ...No recognized SSL/TLS toolkit detected 解决办法: ...
- Libevent核心原理
Libevent 是一个事件驱动框架, 不能仅说他是一个网络库. notejs就是采用与libevent类似的libev来做核心驱动的. Libevent支持三种事件:io事件.信号事件.时间事件 ...
- 分享下mac安装xamarin跨平台开发环境的坑
之前在vs2015上安装好了xamarin环境,考虑到调试IOS仍然需要mac机,昨天决定直接在mac上安装xamarin. 安装完所有的效果如上图,此时已经可以创建安卓和IOS环境. 我安装过程中, ...
- Java的常用包
java.lang: 这个包下包含了Java语言的核心类,如String.Math.Sytem和Thread类等,使用这个包无需使用import语句导入,系统会自动导入这个包中的所有类. java. ...
- xhtml头文件设置
设置字符集编码: <head> <meta http-equiv="Content-Type" Content="text/html" cha ...
- unity 内置的CG结构解析
一.Cg顶点程序必须在结构中传递顶点数据.几种常用的顶点结构定义在文件UnityCG.cginc中.在大部分情况下仅仅使用它们就够了.结构如下: 1.appdata_base: 包含顶点位置,法线和一 ...
题目链接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 ...
升级系统,把php5.2.9升级到5.3.6,按照以前的编译参数,configure能正常通过,但是在make的时候提示: In file included from /root/php-5.3.6 ...
对DBWR的一些理解 首先从名称上,DBWR全称是Database Writer Process,属于Oracle后台进程的一种,有的地方也叫DBWn,我想这里是出于DBWR进程个数的原因,DBWR进 ...
虽然网上有很多了,还是记录一下吧, 解决思路:不用计算Toast的时间之类的,就是定义一个全局的成员变量Toast, 这个Toast不为null的时候才去make,否则直接setText.为了按返回键 ...
继续上次的spring服务的问题,这边介绍一种spring配置客户端的方法. 1.src目录下新建client-beans.xml文件 <?xml version="1.0" ...
apache安装 1, no SSL-C headers found configure: error: ...No recognized SSL/TLS toolkit detected 解决办法: ...
Libevent 是一个事件驱动框架, 不能仅说他是一个网络库. notejs就是采用与libevent类似的libev来做核心驱动的. Libevent支持三种事件:io事件.信号事件.时间事件 ...
之前在vs2015上安装好了xamarin环境,考虑到调试IOS仍然需要mac机,昨天决定直接在mac上安装xamarin. 安装完所有的效果如上图,此时已经可以创建安卓和IOS环境. 我安装过程中, ...
java.lang: 这个包下包含了Java语言的核心类,如String.Math.Sytem和Thread类等,使用这个包无需使用import语句导入,系统会自动导入这个包中的所有类. java. ...
设置字符集编码: <head> <meta http-equiv="Content-Type" Content="text/html" cha ...
一.Cg顶点程序必须在结构中传递顶点数据.几种常用的顶点结构定义在文件UnityCG.cginc中.在大部分情况下仅仅使用它们就够了.结构如下: 1.appdata_base: 包含顶点位置,法线和一 ...