HDU 2865 Birthday Toy
题意:n个小珠子组成的正n边形,中间有一个大珠子。有木棍相连的两个珠子不能有相同的颜色,旋转后相同视为相同的方案,求着色方案数。
\(\\\)
先选定一种颜色放在中间,剩下的\(k-1\)种颜色再摆在环上。下面直接令\(k=k-1\)。
根据Burnside引理,\(ans=\sum_{a|n}f(a)\phi(\frac{n}{a})\)。\(f(a)\)表示最多使用\(k\)种颜色且长度为\(a\)的,首尾以及相邻珠子颜色互不相同的方案数。计算\(f(n)\)时,假设\(n-1\)号珠子与\(1\)号珠子相同,则对答案的贡献为\((k-1)\cdot f(n-2)\);若不同,贡献为\((k-2)\cdot f(n-1)\)。所以\(f(n)=(k-1)\cdot f(n-2)+(k-2)\cdot f(n-1)\)。用矩阵快速幂就好了。
代码:
#include<bits/stdc++.h>
#define ll long long
#define N 1000005
#define mod 1000000007
using namespace std;
inline int Get() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}while('0'<=ch&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;}
ll n,k;
int p[N];
bool vis[N];
void pre(int n) {
for(int i=2;i<=n;i++) {
if(!vis[i]) p[++p[0]]=i;
for(int j=1;j<=p[0]&&1ll*i*p[j]<=n;j++) {
vis[i*p[j]]=1;
if(i%p[j]==0) break;
}
}
}
int phi(int n) {
ll ans=n;
for(int i=1;1ll*p[i]*p[i]<=n;i++) {
if(n%p[i]==0) ans=(ans-ans/p[i]);
while(n%p[i]==0) n/=p[i];
}
if(n>1) ans=(ans-ans/n);
return ans;
}
struct matrix {
ll f[2][2];
void Init() {memset(f,0,sizeof(f));}
}tem,g,t;
matrix operator *(const matrix &a,const matrix &b) {
tem.Init();
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
for(int k=0;k<2;k++)
(tem.f[i][j]+=a.f[i][k]*b.f[k][j])%=mod;
return tem;
}
matrix ksm(matrix g,int x) {
matrix ans;
ans.Init();
for(int i=0;i<2;i++) ans.f[i][i]=1;
for(;x;x>>=1,g=g*g)
if(x&1) ans=ans*g;
return ans;
}
ll ksm(ll t,ll x) {
ll ans=1;
for(;x;x>>=1,t=t*t%mod)
if(x&1) ans=ans*t%mod;
return ans;
}
ll cal(ll n) {
if(n==1) return 0;
matrix ans=t*ksm(g,n-2);
return ans.f[0][1];
}
int main() {
pre(1000000);
while(scanf("%lld%lld",&n,&k)!=EOF) {
g.f[0][0]=0,g.f[0][1]=k-2;
g.f[1][0]=1,g.f[1][1]=k-3;
t.f[0][0]=0,t.f[0][1]=(k-1)*(k-2)%mod;
ll ans=0;
for(int i=1,maxx=sqrt(n);i<=maxx;i++) {
if(n%i==0) {
(ans+=cal(i)*phi(n/i)%mod)%=mod;
if(i*i!=n) (ans+=cal(n/i)*phi(i)%mod)%=mod;
}
}
ans=ans*ksm(n,mod-2)%mod;
ans=ans*k%mod;
cout<<ans<<"\n";
}
return 0;
}
HDU 2865 Birthday Toy的更多相关文章
- HDU 2865 Birthday Toy [Polya 矩阵乘法]
传送门 题意: 相邻珠子不能相同,旋转等价.$n$个珠子$k$中颜色,求方案数 首先中间珠子$k$种选择,$k--$如果没有相邻不同的限制,就和$POJ\ 2154$一样了$|C(f)|=k^{\#( ...
- hdu 2865 Polya计数+(矩阵 or 找规律 求C)
Birthday Toy Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- HDU 2865
和上题一样,但K较大,不能直接用矩阵来写.这个矩阵必定是这个形式的. 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 分成对角线上元素B与非对角线上元素A k: 1 2 3 4 ... ...
- hdu 2481 Toy
好题!!!没话说…… 用到的知识面很多,这题的难点在于公式的推导. 原始推导过程见:http://hi.baidu.com/spellbreaker/item/d8bb3bda5af30be6795d ...
- HDU 1007 Quoit Design(二分+浮点数精度控制)
Quoit Design Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- hdu 4052 线段树扫描线、奇特处理
Adding New Machine Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- hdu 1828 线段树扫描线(周长)
Picture Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- hdu 4453 splay
Looploop Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- 随手练——HDU 1078 FatMouse and Cheese(记忆化搜索)
http://acm.hdu.edu.cn/showproblem.php?pid=1078 题意: 一张n*n的格子表格,每个格子里有个数,每次能够水平或竖直走k个格子,允许上下左右走,每次走的格子 ...
随机推荐
- git第九节---git命令实战
1. git 项目创建 mkdir git-command 2.git 配置 git config --list 配置用户名 邮箱 git config user.name 'XXX' --loca ...
- NLog日志框架使用探究-1
目录 前言 为什么是NLog? 目的 配置 基本配置 日志等级 输出例子 目标 参数 规则 日志分发 日志收集 结语 参考文档 前言 日志是每个程序的基本模块.本文是为了探究如何通过NLog方便及记录 ...
- FFmpeg流媒体处理-收流与推流
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10623968.html 1. 简介 流媒体是使用了流式传输的多媒体应用技术.如下是维基百 ...
- 快速排序的Java和python实现,亲测实际可用
1.基本思想 快速排序每趟排序确定一个元素x的位置,使用的方式是 将大于元素x的值放大x的右边,小于元素x的值放大x的左边.当确定x的位置之后,再分别对x左边的数组和右边的数组进行快速排序即可. 2. ...
- cmd 导入数据库文件
mysql -uroot -p show databases use 库名 source D:\kuming.sql
- Shell 文件测试运算符
文件测试运算符 文件测试运算符用于检测 Unix 文件的各种属性. 属性检测描述如下: 操作符 说明 举例 -b file 检测文件是否是块设备文件,如果是,则返回 true. [ -b $file ...
- c# 导出表格
var record = m_editor.getMasterRecord(); var Check_Id = record.Check_Id; var url = "/Storage/St ...
- 通向全栈之路(6)—无密码ssh连接
(1)在用户目录下新增一个 .ssh文件 mkdir .ssh (2)生成公钥.私钥 ssh-keygen -t rsa -b 4096 -C "mail@xxx.com" (3) ...
- Struts2框架笔记02_API_结果页面配置_数据的封装
目录 1. Struts2的Servlet的API的访问 1.1 方式一:完全解耦合的方式 1.1.1 环境搭建 1.1.2 代码 1.1.3 测试 1.1.4 向域对象中存入数据 1.2 方式二:使 ...
- 【Java基础】11、java方法中只有值传递,没有引用传递
public class Example { String testString = new String("good"); char[] testCharArray = {'a' ...