题面

先往上套Burnside引理

既然要求没有$\frac{2*π}{n}$的角,也就是说两个人不能挨着,那么相当于给一个环黑白染色,两个相邻的点不能染白色,同时求方案数。考虑$n$个置换子群,即向一边旋转i(1<=i<=n)个单位,那么每个置换子群下循环节的长度是$lcm(i,n)/i$,那循环节数目就是$n/(lcm(i,n)/i)=gcd(i,n)$,然后式子就出来了,设$p(i)$是给长度为$i$的环染色的方案

$ans=\frac{\sum\limits_{i=1}^np(gcd(i,n))}{n}$

如果我们能快速算$p$那么枚举$d=gcd(i,n)$即可,现在考虑如何算$p$,不妨先设$dp[i][0/1]$表示染了长度为$i$的环,两边白色的点的数目为$0/1$的方案数,转移显然

$dp[i][0]=dp[i-1][0]+dp[i-1][1],dp[i][1]=dp[i-1][0]$

可见$dp[i][0]$就是$i-1$的答案,$dp[i][1]$就是$dp[i-1][0]$也就是$i-2$的答案,所以$p[i]=p[i-1]+p[i-2]$,矩乘即可

注意$n=1$“两边”都是可以染白色的,判掉

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int mod=1e9+;
struct a
{
int mat[][];
void Clean()
{
memset(mat,,sizeof mat);
}
void Init1()
{
Clean();
mat[][]=,mat[][]=;
}
void Init2()
{
Clean();
mat[][]=mat[][]=mat[][]=;
}
};
a Matime(a x,a y)
{
a ret; ret.Clean();
for(int i=;i<;i++)
for(int k=;k<;k++)
for(int j=;j<;j++)
ret.mat[i][j]+=1ll*x.mat[i][k]*y.mat[k][j]%mod,ret.mat[i][j]%=mod;
return ret;
}
a Maqpow(a x,int k)
{
if(k==) return x;
a tmp=Maqpow(x,k/);
return k%?Matime(x,Matime(tmp,tmp)):Matime(tmp,tmp);
}
int Calc(int x)
{
if(x==) return ;
if(x==) return ;
a fir,cal; fir.Init1(),cal.Init2();
cal=Maqpow(cal,x-),fir=Matime(fir,cal);
return fir.mat[][];
}
int Phi(int x)
{
int ret=x;
for(int i=;i*i<=x;i++)
if(x%i==)
{
ret/=i,ret*=i-;
while(x%i==) x/=i;
}
if(x!=) ret/=x,ret*=x-;
return ret;
}
void exGCD(int a,int b,int &x,int &y)
{
if(!b) x=,y=;
else exGCD(b,a%b,y,x),y-=a/b*x;
}
int Inv(int x)
{
int xx,yy;
exGCD(x,mod,xx,yy);
return (xx%mod+mod)%mod;
}
int Solve(int x)
{
if(x==) return ;
int ret=;
for(int i=;i*i<=x;i++)
if(x%i==)
{
ret+=1ll*Phi(x/i)*Calc(i)%mod,ret%=mod;
if(i*i!=x) ret+=1ll*Phi(i)*Calc(x/i)%mod,ret%=mod;
}
return 1ll*ret*Inv(x)%mod;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
printf("%d\n",Solve(n));
return ;
}

解题:HDU 5868 Different Circle Permutation的更多相关文章

  1. HDU 5868 Different Circle Permutation(burnside 引理)

    HDU 5868 Different Circle Permutation(burnside 引理) 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=586 ...

  2. hdu 5868:Different Circle Permutation 【Polya计数】

    似乎是比较基础的一道用到polya定理的题,为了这道题扣了半天组合数学和数论. 等价的题意:可以当成是给正n边形的顶点染色,旋转同构,两种颜色,假设是红蓝,相邻顶点不能同时为蓝. 大概思路:在不考虑旋 ...

  3. HDU 5868 Different Circle Permutation

    公式,矩阵快速幂,欧拉函数,乘法逆元. $an{s_n} = \frac{1}{n}\sum\limits_{d|n} {\left[ {phi(\frac{n}{d})×\left( {fib(d ...

  4. HDU 5868 Different Circle Permutation Burnside引理+矩阵快速幂+逆元

    题意:有N个座位,人可以选座位,但选的座位不能相邻,且旋转不同构的坐法有几种.如4个座位有3种做法.\( 1≤N≤1000000000 (10^9) \). 题解:首先考虑座位不相邻的选法问题,如果不 ...

  5. hdu 5868 Polya计数

    Different Circle Permutation Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 262144/262144 K ...

  6. hdu 5225 Tom and permutation(回溯)

    题目链接:hdu 5225 Tom and permutation #include <cstdio> #include <cstring> #include <algo ...

  7. 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 ...

  8. hdu_5868:Different Circle Permutation

    似乎是比较基础的一道用到polya定理的题,为了这道题扣了半天组合数学和数论. 等价的题意:可以当成是给正n边形的顶点染色,旋转同构,两种颜色,假设是红蓝,相邻顶点不能同时为蓝. 大概思路:在不考虑旋 ...

  9. HDU - 6446 Tree and Permutation

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6446 本题是一个树上的问题——DFS. 一棵N个结点的树,其结点为1~N.树具有N-1条边,每一条边具有 ...

随机推荐

  1. MySQL优化:explain using temporary

    什么时候会使用临时表:group/order没设计好的时候 1.order没用索引 2.order用了索引, 但不是和where相同的索引 3.order用了两个索引, 但不是联合索引 4.order ...

  2. Partition2:对现有表分区

    在SQL Server中,普通表可以转化为分区表,而分区表不能转化为普通表,普通表转化成分区表的过程是不可逆的,将普通表转化为分区表的方法是: 在分区架构(Partition Scheme)上创建聚集 ...

  3. effective c++ 笔记 (26-29)

    //---------------------------15/04/09---------------------------- //#26   尽可能延后变量定义式的出现时间 { /*  1:只要 ...

  4. 如何安装ipa文件(二)

    第一篇文章请看: http://www.cnblogs.com/BK-12345/p/6000124.html 写第二篇的目的是因为iTunes更新了,有一些东西发生了变化,应用没有了,其实还是存在的 ...

  5. 高精度乘法--C++

    高精度乘法--C++ 模仿竖式乘法,在第一步计算的时候将进位保留,第一步计算完再处理进位.(见代码注释) 若要处理正负情况,可在数据输入后加以判断,处理比较简单. 小数计算也可参照该方法,不过对齐方式 ...

  6. 记录:TensorFlow 中的 padding 方式

    TensorFlow 中卷积操作和池化操作中都有一个参数 padding,其可选值有 ['VALID', 'SAME']. 在 TensorFlow 文档中只是给出了输出张量的维度计算方式,但是并没有 ...

  7. arduino驱动安装

    方法一:使用官方提供的一键安装程序安装 打开Arduino在你电脑上的位置如果你的电脑是32位系统,就运行dpinst-x86.exe如果是64位系统,就运行dpinst-amd64.exe然后在弹出 ...

  8. PAT甲级题解-1100. Mars Numbers (20)-字符串处理

    没什么好说的,注意字符串的处理,以及当数字是13的倍数时,只需高位叫法的单词.比如26,是“hel”,而不是“hel tret”. 代码: #include <iostream> #inc ...

  9. 11.12 Daily Scrum(保存草稿后忘了发布·····)

    在实现过程中,我们发现要将不同人开发的组件整合起来并不是一件容易的事,于是我们调整了一下任务,修改了一下各自的程序:   Today's tasks  Tomorrow's tasks 丁辛 餐厅列表 ...

  10. 毕业设计---jQuery动态生成的a标签的事件绑定

    这几天在毕业设计的前端设计阶段,准备放弃使用jsp,完全通过html+ajax+SSH进行网站的编写,在前端的页面显示我准备使用jQuery来实现数据的动态绑定.但是遇到动态添加的a标签无法直接通过$ ...