根据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 Buffer+

    一个队列如果只生产不消费肯定不行的,那么如何及时消费Ring Buffer的数据呢?简单的方案就是当Ring Buffer"写满"的时候一次性将数据"消费"掉. ...

  2. OpenCASCADE Ring Type Spring Modeling

    OpenCASCADE Ring Type Spring Modeling eryar@163.com Abstract. The general method to directly create ...

  3. 使用Ring Buffer构建高性能的文件写入程序

    最近常收到SOD框架的朋友报告的SOD的SQL日志功能报错:文件句柄丢失.经过分析得知,这些朋友使用SOD框架开发了访问量比较大的系统,由于忘记关闭SQL日志功能所以出现了很高频率的日志写入操作,从而 ...

  4. [AlwaysOn Availability Groups]AlwaysOn Ring Buffers

    AlwaysOn Ring Buffers 一些AlwaysOn的诊断信息可以从SQL Server ring buffers.或者从sys.dm_os_ring_buffers.ring buffe ...

  5. UVa 524 Prime Ring Problem(回溯法)

    传送门 Description A ring is composed of n (even number) circles as shown in diagram. Put natural numbe ...

  6. Ring buffers and queues

    Ring buffers and queues The data structure is extremely simple: a bounded FIFO. One step up from pla ...

  7. Prime Ring Problem

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

  8. hdoj 1016 Prime Ring Problem

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

  9. uva 524 prime ring problem——yhx

      Prime Ring Problem  A ring is composed of n (even number) circles as shown in diagram. Put natural ...

随机推荐

  1. java反射机制实例

    1.通过数据库字段反射给对象实例赋值 convertClass.java /** * 通过反射构造对象 * @param obj * @param rs * @return */ public Obj ...

  2. sublime快捷键的使用

    Sublime text 3是码农最喜欢的代码编辑器,每天和代码打交道,必先利其器,掌握基本的代码编辑器的快捷键,能让你打码更有效率.刚开始可能有些生疏,只要花一两个星期坚持使用并熟悉这些常用的快捷键 ...

  3. MyBatis - 4.动态SQL

    动态 SQL是MyBatis强大特性之一.极大的简化我们拼装SQL的操作. 动态 SQL 元素和使用 JSTL 或其他类似基于 XML 的文本处理器相似. MyBatis 采用功能强大的基于 OGNL ...

  4. python---通过递归和动态规划策略解决找零钱问题

    也是常见套路. # coding = utf-8 def rec_mc(coin_value_list, change, know_results): min_coins = change if ch ...

  5. C#default关键字(泛型代码中的默认关键字)

    在泛型类和泛型方法中产生的一个问题是,在预先未知以下情况时,如何将默认值分配给参数化类型 T:T 是引用类型还是值类型.如果 T 为值类型,则它是数值还是结构.给定参数化类型 T 的一个变量 t,只有 ...

  6. [转] js前端解决跨域问题的8种方案(最新最全)

    1.同源策略如下: URL 说明 是否允许通信 http://www.a.com/a.jshttp://www.a.com/b.js 同一域名下 允许 http://www.a.com/lab/a.j ...

  7. sparkStreaming消费kafka-0.8方式:direct方式(存储offset到zookeeper)

    生产中,为了保证kafka的offset的安全性,并且防止丢失数据现象,会手动维护偏移量(offset) 版本:kafka:0.8 其中需要注意的点: 1:获取zookeeper记录的分区偏移量 2: ...

  8. Codeforces 653F Paper task SA

    Paper task 如果不要求本质不同直接st表二分找出最右端, 然后计数就好了. 要求本质不同, 先求个sa, 然后用lcp求本质不同就好啦. #include<bits/stdc++.h& ...

  9. UOJ#62. 【UR #5】怎样跑得更快 数论 莫比乌斯反演

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ62.html 题解 太久没更博客了,该拯救我的博客了. $$\sum_{1\leq j \leq n} \ ...

  10. BZOJ4025 二分图 分治 并查集 二分图 带权并查集按秩合并

    原文链接http://www.cnblogs.com/zhouzhendong/p/8683831.html 题目传送门 - BZOJ4025 题意 有$n$个点,有$m$条边.有$T$个时间段.其中 ...