前言

这是一道Burnside引理的应用题

题目相关

链接

题目大意

一个长度为nnn的010101圈,没有超过kkk个的连续的111,求方案数

数据范围

T≤50,n≤2000,k≤2000T\le50,n\le2000,k\le2000T≤50,n≤2000,k≤2000

题解

我们设fif_ifi​表示不含超过kkk个连续111的长度为iii的链的数量
我们考虑求fif_ifi​,用所有方案减去不合法方案数,对于一个长度为i−1i-1i−1的不合法方案,其后面再加上一个数字,其依然不合法,然后我们考虑因为加入最后一位而不合法的串,一定是最后k+1k+1k+1位是111,倒数第k+2k+2k+2位是000,并且其它位合法,那么直接递推即可

我们设hih_ihi​表示长度为iii、包含至少一个000、不含超过连续kkk个111的环的数量(固定111号点)
先不说要如何计算

我们考虑答案,我们列出Burnside引理的式子
l=1∣G∣∑ai∈Gc1(ai)l=\frac{1}{|G|}\sum_{a_i\in G}c_1(a_i)l=∣G∣1​ai​∈G∑​c1​(ai​)
我们发现对于所有置换(即所有0≤i&lt;n0\le i&lt;n0≤i<n,转动iii次),其c(ai)c(a_i)c(ai​)刚好是最小整除周期是iii的因数的方案数,实际操作的时候我们发现c(ai)=hgcd(i,n)c(a_i)=h_{gcd(i,n)}c(ai​)=hgcd(i,n)​

我们考虑如何求hih_ihi​,我们发现我们可以在一条链的两端连上01⋅⋅⋅1001···1001⋅⋅⋅10形式的一串(其中111的数量要小于等于kkk),我们枚举111的数量至少为几,我们再枚举接入的位置,我们发现,插入的元素越多,方案越多
我们设原串为XXX,插入的iii个111在头与尾的串分别为AAA和BBB,我们发现,最后一定是“A0X0BA0X0BA0X0B”的形式,我们发现若111的个数为iii,那么就有i+1i+1i+1种方案
那么我们考虑对fff进行前缀和,并且对于所有iii直接转移选iii~kkk个的方案,那么iii个的方案就会被转移到i+1i+1i+1次,即可

我们发现只有iii是nnn的因数时,hih_ihi​是要求的,直接dpdpdp一个hih_ihi​在i≤ki\le ki≤k的时候是O(1)\mathcal O(1)O(1)的,i&gt;ki&gt;ki>k的时候是O(k)\mathcal O(k)O(k)的,那么总复杂度为
O(∑i&gt;k,i∣nk)\mathcal O\left(\sum_{i&gt;k,i|n}k\right)O⎝⎛​i>k,i∣n∑​k⎠⎞​
我们设大于kkk且是nnn的因数的数有xxx个,容易发现nnn的因数从大到小排,第jjj个的值小于等于nj\frac njjn​,那么k≤nxk\le\frac nxk≤xn​,那么x∗k≤nx*k\le nx∗k≤n,即直接dpdpdp是O(n)\mathcal O(n)O(n)的

另外,我们发现对于所有c(ai)c(a_i)c(ai​)的求和可以枚举j=gcd(i,n),那么贡献次数就是φ(ni)\varphi(\frac ni)φ(in​),我们可以通过线性筛筛φ\varphiφ,并且枚举jjj,这样就可以做到O(n)\mathcal O(n)O(n)的复杂度

综上,总复杂度O(n)\mathcal O(n)O(n)

代码

#include<bits/stdc++.h>
typedef long long ll;
#define rg register
template <typename T> inline void read(T&x){char cu=getchar();x=0;bool fla=0;while(!isdigit(cu)){if(cu=='-')fla=1;cu=getchar();}while(isdigit(cu))x=x*10+cu-'0',cu=getchar();if(fla)x=-x;}
template <typename T> inline void printe(const T x){if(x>=10)printe(x/10);putchar(x%10+'0');}
template <typename T> inline void print(const T x){if(x<0)putchar('-'),printe(-x);else printe(x);}
template <typename T> inline T gcd(const T a,const T b){if(!b)return a;return gcd(b,a%b);}
const int maxn=2001;
const ll mod=100000007;
inline int pow(int x,int y)
{int res=1;for(;y;y>>=1,x=(ll)x*x%mod)if(y&1)res=(ll)res*x%mod;return res;
}
inline void md(int&x){if(x>=mod)x-=mod;}
inline int Md(const int x){return x>=mod?x-mod:x;}
int n,k,bit[maxn],F[maxn+5],*f=F+5,h[maxn],sum;
ll T,ans;
bool isprime[maxn];int prime[maxn],primesize,phi[maxn];
inline void getphi(const int size)
{phi[1]=1;memset(isprime,1,sizeof(isprime));for(rg int i=2;i<=size;i++){if(isprime[i])prime[++primesize]=i,phi[i]=i-1;for(rg int j=1;j<=primesize&&(ll)prime[j]*i<=size;j++){isprime[prime[j]*i]=0;if(i%prime[j]==0){phi[prime[j]*i]=phi[i]*prime[j];break;}phi[prime[j]*i]=phi[i]*(prime[j]-1);}}
}
int main()
{//  freopen("party.in","r",stdin),freopen("party.out","w",stdout);bit[0]=1;for(rg int i=1;i<=2000;i++)bit[i]=Md(bit[i-1]<<1);getphi(2000);read(T);while(T--){read(n),read(k);if(k>n)k=n;sum=0,ans=0;memset(F,0,sizeof(F));memset(h,0,sizeof(h));for(rg int i=0;i<=k;i++)f[i]=bit[i];f[-1]=1;for(rg int i=k+1;i<=n;i++){sum=Md(Md(sum<<1)+f[i-k-2]);f[i]=Md(bit[i]-sum+mod);}for(rg int i=0;i<=n;i++)f[i]=Md(f[i]+f[i-1]);for(rg int i=1;i<=n;i++)if(n%i==0){if(i<=k)h[i]=bit[i]-1;else for(rg int j=0;j<=k;j++)h[i]=Md(Md(h[i]+f[i-j-2])+mod-f[i-k-3]);ans+=(ll)h[i]*phi[n/i]%mod;}print(((ans%mod+mod)*pow(n,mod-2)+(n==k))%mod),putchar('\n');}return 0;
}

总结

Burnside引理知道就好
主要是要求的东西会求
优化复杂度大法好

[bzoj1547]周末晚会相关推荐

  1. jzoj4800-[GDOI2017模拟9.24]周末晚会【dp,循环重构】

    正题 题目大意 nnn个人的圆桌,可以放男可以放女,然后要求不能有连续kkk个女生坐在一起.求方案总数. 解题思路 先不考虑圆桌,设fi,jf_{i,j}fi,j​表示放了i个人,最前面有连续jjj个 ...

  2. 欢乐纪中A组周六赛【2019.6.1】

    前言 六一儿童节快乐(然而我还在学校) dalao都走了,导致只剩下我们这帮菜鸡在被虐 成绩 JJJ表示初中,HHH表示高中后面加的是几年级 RankRankRank PersonPersonPers ...

  3. Greetings and Introduction (1)

    Chapter One  Greetings and Introduction 第一章  问候与介绍 Section 1  Business Background Tips 第一节  商务文化背景与技 ...

  4. 五一惠州双月湾游,海滩,帐篷,野营,烧烤、篝火晚会

    惠州沙滩周末两日一晚游 活动介绍 线路特色 行程安排 费用说明 粉丝优惠价 注意事项 客服专线 报名入口 路上干点啥呢 惠州双月湾帐篷露营.烧烤BBQ.篝火晚会狂欢.出海捕鱼二日游 为公司企业团体策划 ...

  5. 月圆“会客厅“欢度国庆节,平度举行2020中秋十一晚会

    10月1日"今天是你的生日,我的中国--"随着激昂的乐曲响起,荧光挥舞,欢声笑语,平度市奥体中心广场成了欢乐的海洋. 9月30日晚,平度市"月圆会客厅欢度国庆节" ...

  6. 央视 315 晚会曝光数据泄露

    01 数据泄露之殇 央视 3·15 晚会曝光了多个免费 WiFi 软件伪造广告链接.收集用户信息.推送弹窗广告等问题. 某实验室在测试了 20 余款号称免费 WiFi 的应用程序后发现,免费 WiFi ...

  7. 南京python培训周末班

    2020年度"中国大学生自强之星"奖学金推报活动由共青团中央.全国学联指导,中国青年报社.新东方教育科技集团联合开展.活动以"青春自强 奋勇争先"为主题,自开展 ...

  8. 【小程序合集】哪个游戏可以陪你度过周末?

    极乐商店整理了24款微信益智小游戏,这个周末可以让TA好好陪你了! 1.功夫拼图 创新的多人协作玩法,拼图一加一,我拼一张你拼一张,挥洒创意,总能让我们忍俊不禁.朋友一起才好玩- 2.狼人杀小法官 『 ...

  9. 看着G20晚会的烟花,手机却收到了这个...

    昨天,第11届20国集团金融峰会--G20在杭州盛大开幕.相比白天各国首脑们聊得火热,相信更多人都像我一样是被G20华美精致的晚会所深深吸引.张艺谋导演继北京奥运会后凭借其超凡的艺术天赋再一次震惊了世 ...

最新文章

  1. Java项目:(小程序)全套商城系统(spring+spring mvc+mybatis+layui+微信小程)
  2. A里正在拆中台,你还在建中台吗?
  3. Tensorflow【实战Google深度学习框架】使用 HDF5 处理大型数据集with TFLearn
  4. Windows下怎样设置jar包开机自启动运行
  5. 监测磁盘文件是否被修改程序
  6. Linux内核态抢占机制分析
  7. java中的equals用法
  8. 所谓语音合成 是计算机根据语言学,计算语言学完整1
  9. 计算机控制系统b卷,计算机控制系统年期末考试b卷.docx
  10. Netty工作笔记0006---NIO的Buffer说明
  11. centos 环境变量_CentOS系统下为用户添加root权限
  12. java IO 超详细讲解
  13. ActiveX控件使用总结
  14. 人大金仓数据库迁移步骤
  15. 【51单片机】SG90舵机控制
  16. 聊天三个小时后发生的故事
  17. [转载]MySQL 中 char 与 varchar 能存多少汉字问题_-Chaz-_新浪博客
  18. math.abs() java_Java中使用Math.abs你入坑了?
  19. 题解报告——星际战争
  20. 怎么把PWM信号转为模拟量

热门文章

  1. JUL执行原理和流程
  2. 上传问题分析--目录分离
  3. 循环结构_while循环
  4. MapReduce分区-代码实现
  5. MapReduce案例-wordcount-JobMain代码
  6. ReactJS入门之组件
  7. 动态添加行 为元素解绑事件 delegate的解绑事件 off的解绑事件
  8. android 调用.h文件,[Android Studio / NDK] 如何使用javah生成.h文件
  9. Spring Boot配置文件有提示
  10. oracle与jdbc连接数据库,JDBC与Oracle数据库连接