题目链接

题意: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的更多相关文章

  1. HDU 2865 Birthday Toy [Polya 矩阵乘法]

    传送门 题意: 相邻珠子不能相同,旋转等价.$n$个珠子$k$中颜色,求方案数 首先中间珠子$k$种选择,$k--$如果没有相邻不同的限制,就和$POJ\ 2154$一样了$|C(f)|=k^{\#( ...

  2. hdu 2865 Polya计数+(矩阵 or 找规律 求C)

    Birthday Toy Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

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

  4. hdu 2481 Toy

    好题!!!没话说…… 用到的知识面很多,这题的难点在于公式的推导. 原始推导过程见:http://hi.baidu.com/spellbreaker/item/d8bb3bda5af30be6795d ...

  5. HDU 1007 Quoit Design(二分+浮点数精度控制)

    Quoit Design Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  6. hdu 4052 线段树扫描线、奇特处理

    Adding New Machine Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  7. hdu 1828 线段树扫描线(周长)

    Picture Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  8. hdu 4453 splay

    Looploop Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  9. 随手练——HDU 1078 FatMouse and Cheese(记忆化搜索)

    http://acm.hdu.edu.cn/showproblem.php?pid=1078 题意: 一张n*n的格子表格,每个格子里有个数,每次能够水平或竖直走k个格子,允许上下左右走,每次走的格子 ...

随机推荐

  1. Configure Many-to-Many relationship:

    Configure Many-to-Many relationship: Here, we will learn how to configure Many-to-Many relationship ...

  2. 【图文详细教程】maven3安装配置+eclipse离线安装maven3插件《《唯一成功的教程~~~2018-01-09》》

    环境搭建前提: 1.电脑上已经安装了1.7以及以上版本的JDK(因为我提供的maven版本是最新的3.3.9的,要求最低JDK1.7) 2.配置好了ecplise并且能正常启动 第一步:下载maven ...

  3. Scala面向对象编程与类型系统

    Scala支持面向对象编程, 其面向对象特性与Java有共同之处并添加了很多新的特性. 类定义 scala使用class关键字定义类: class MyComplex(real0:Double, im ...

  4. ASOC 音频子系统框架

    基于: Mini2440 开发板, Linux 3.4.2 内核 ASOC 简介: ASoC - ALSA System on Chip,是建立在标准ALSA驱动层上,为了更好地支持嵌入式处理器和移动 ...

  5. Uboot 引导内核时加载地址与入口地址问题

    如果使用 mkimage 生成内核镜像文件的话,会在内核的前头加上了 64 bytes 的信息头,供建立 tag 之用.bootm 命令会首先判断 bootm xxx 这个指定的地址 xxx 与 -a ...

  6. c#:HttpClient加标头

    using (var client = new HttpClient()) { string requestUrl = string.Format("{0}{1}", ConstD ...

  7. webAPI文件上传时文件过大404错误的问题

    背景:最近公司有个需求,外网希望自动保存数据到内网,内网有2台服务器可以相互访问,其中一台服务器外网可以访问,于是想在 这台服务器上放个中转的接口.后来做出来以后测试发现没有问题就放线上去了,不顾发现 ...

  8. Java并发编程:Java线程池核心ThreadPoolExecutor的使用和原理分析

    目录 引出线程池 Executor框架 ThreadPoolExecutor详解 构造函数 重要的变量 线程池执行流程 任务队列workQueue 任务拒绝策略 线程池的关闭 ThreadPoolEx ...

  9. 利用反射调用注解,模仿Spring

    简介 在开发中,我们经常用的就是利用@RequestMapping来调用我们自己的逻辑,现在我们来创建属于自己的注解模仿一下它. 1.新建属于自己的注解@SeayaMapping @Target({E ...

  10. canvas学习和滤镜实现

    最近学习了 HTML5 中的重头戏--canvas.利用 canvas,前端人员可以很轻松地.进行图像处理.其 API 繁多,这次主要学习常用的 API,并且完成以下两个代码: 实现去色滤镜 实现负色 ...