根据Polya定理:

\[ans=\frac{\sum_{d|n}\varphi(d)cal(\frac{n}{d})}{n}\]

其中$cal(n)$表示长度为$n$的无限循环后包含$S$的串的数量。

对于$cal(n)$的计算,考虑用总方案数$2^n$减去单次循环内不包含$S$的方案数。

枚举进入循环时与$S$的KMP指针$k$,然后设$f[i][j]$表示考虑前$i$个位置,KMP指针为$j$的方案数,最终结果为$f[n][k]$。

转移可以用矩阵$G$表示,预处理出$G$的$2^0,2^1,...,2^{\log n}$次方,那么每次计算$cal(n)$只需要进行$O(k\log n)$次$O(k^2)$的矩阵乘向量。

总时间复杂度$O(d(n)k^3\log n)$。

#include<cstdio>
#define rep(i) for(int i=0;i<m;i++)
const int N=35,P=1000000007;
int n,m,i,j,k,nxt[N],g[N][2],e[N][N][N],c[N][N],f[N],h[N],ans;char a[N];
inline void mul(int a[][N],int f[][N]){rep(i)rep(j)c[i][j]=0;rep(i)rep(j)if(a[i][j])rep(k)if(a[j][k])c[i][k]=(1LL*a[i][j]*a[j][k]+c[i][k])%P;rep(i)rep(j)f[i][j]=c[i][j];
}
inline void mulv(int a[][N]){rep(i){h[i]=0;rep(j)if(f[j]&&a[i][j])h[i]=(1LL*f[j]*a[i][j]+h[i])%P;}rep(i)f[i]=h[i];
}
inline int phi(int n){int t=1;for(int i=2;i<=n/i;i++)if(n%i==0){t*=i-1,n/=i;while(n%i==0)t*=i,n/=i;}if(n>1)t*=n-1;return t;
}
inline int po(int a,int b){int t=1;for(;b;b>>=1,a=1LL*a*a%P)if(b&1)t=1LL*t*a%P;return t;}
inline int cal(int n){int t=0;for(int i=0;i<m;i++){rep(j)f[j]=i==j;for(int j=0;(1LL<<j)<=n;j++)if(n>>j&1)mulv(e[j]);t=(t+f[i])%P;}return(po(2,n)-t+P)%P;
}
int main(){scanf("%d%d%s",&n,&m,a+1);for(i=1;i<=m;i++)a[i]=a[i]=='R';for(i=2;i<=m;nxt[i++]=j){while(j&&a[j+1]!=a[i])j=nxt[j];if(a[j+1]==a[i])j++;}rep(i)for(j=0;j<2;j++){for(k=i;k&&a[k+1]!=j;k=nxt[k]);if(a[k+1]==j)k++;g[i][j]=k;}rep(i)for(j=0;j<2;j++)e[0][g[i][j]][i]++;for(i=1;(1LL<<i)<=n;i++)mul(e[i-1],e[i]);for(i=1;i<=n/i;i++)if(n%i==0){ans=(1LL*phi(i)*cal(n/i)+ans)%P;if(i*i!=n)ans=(1LL*phi(n/i)*cal(i)+ans)%P;}ans=1LL*ans*po(n,P-2)%P;return printf("%d",ans),0;
}

  

BZOJ3457 : Ring相关推荐

  1. Ring Tone Manager on Windows Mobile

    2019独角兽企业重金招聘Python工程师标准>>> 手机铃声经常能够体现一个人的个性,有些哥们儿在自习室不把手机设置成震动,一来电就@#$^%^@&^%#$&$* ...

  2. Datawhale Ring限量100份来了!

    也许未曾相见 但也惺惺相惜 在Datawhale 你或许曾体会过 不一样的温暖 关于Datawhale的故事 这个热爱开源的组织 也有着自己的浪漫 来自文创小组的设计 Datawhale Ring限量 ...

  3. 差异分析定位Ring 3保护模块

    差异分析定位Ring 3保护模块 由于保护模块通常会Hook操作系统的原生DLL接口来进行保护,所以可以采用差异比较原生DLL文件和加载到内存中的原生DLL直接的差别来定位Ring 3模块. 在分析的 ...

  4. DPDK vhost-user之packed ring(六)

    virtio1.1已经在新的kernel和dpdk pmd中陆续支持,但是网上关于这一块的介绍却比较少,唯一描述多一点的就是这个ppt:https://www.dpdk.org/wp-content/ ...

  5. SQL Server 环形缓冲区(Ring Buffer) -- 介绍

    SQL Server 环形缓冲区(Ring Buffer) -- 介绍 以下关于Ring Buffer的介绍转载自: http://zh.wikipedia.org/wiki/%E7%92%B0%E5 ...

  6. HDOJ 1016 HDU 1016 Prime Ring Problem ACM 1016 IN HDU

    题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=1016 题目描述: Prime Ring Problem Time Limit: 4000/2000 ...

  7. GPU高效通信算法-Ring Allreduce

    今天介绍一种新的GPU多卡计算的通信优化算法-Ring Allreduce.先来讲一下常规的GPU多卡分布式计算的原理. 第一点:我们知道GPU在矩阵并行化计算方面非常有优势,所以适合深度学习的训练. ...

  8. nyist 132Prime Ring Problem

    rime Ring Problem A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ..., ...

  9. Delphi 能不能从Ring 3进入Ring 0

    Delphi 能不能从Ring 3进入Ring 0? 楼主skyworld_xm(skyworld)2004-11-19 09:58:55 在 Delphi / Windows SDK/API 提问 ...

  10. [HDOJ1016]Prime Ring Problem

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1016 原题: A ring is compose of n circles as shown in d ...

最新文章

  1. 从零开始 Code Review,两年实战经验分享!
  2. mysql必知必会日期函数,MySQL:MySQL必知必会总结
  3. JDBC驱动的动态加载
  4. phpStorm打开提示 failed to create JVM 的解决的方法
  5. 谈谈如何学习Linux操作系统?
  6. 强大的.NET反编译工具Reflector及插件(转载)
  7. 【鬼网络】之DHCP原理与配置
  8. 《论文笔记》Robust Cooperative UAV Visual SLAM
  9. 用Visual Studio 2008编写Win32汇编程序
  10. 中小企业 DevOps 从 0 到 1
  11. [Music]Candle in the Wind 1997《风中之烛》缅怀戴安娜
  12. STC8H开发(十二): I2C驱动AT24C08,AT24C32系列EEPROM存储
  13. SQLserver常用创建表 添加字段sql
  14. echarts 柱状图 柱顶部显示数字
  15. 关于Log4j 1.x 升级Log4j 2.x 那些事
  16. QT图形显示和处理5
  17. 查询oracle job命令,oracle命令之job详解
  18. adc网络语什么意思_王者荣耀游戏术语解释 ADC是什么意思
  19. 2018 CCPC网络赛1004 HDU6441 Find Integer
  20. 电网负荷调度三维组态软件V2.0

热门文章

  1. 【TP】TP如何向模板中的js传变量
  2. JavaScript跨域调用基于JSON的RESTful API
  3. 很感谢你能来,不遗憾你离开(好文章)
  4. [Angular 2] Transclusion in Angular 2
  5. Android Studio 创建aar包与引用
  6. Appium+python自动化(十一)- 元素定位秘籍助你打通任督二脉 - 下卷(超详解)...
  7. viewport总结
  8. BZOJ 1565: [NOI2009]植物大战僵尸
  9. LintCode 合并二维数组
  10. iOS-Senior19-FMDB第三方应用