MG loves string

 Accepts: 30
 Submissions: 67
 Time Limit: 2000/1000 MS (Java/Others)
 Memory Limit: 262144/262144 K (Java/Others)
问题描述
MG是一个很忙碌的男孩子。今天他沉迷于这样一个问题:

对于一个长度为N的由小写英文字母构成的随机字符串,当它进行一次变换,所有字符i都会变成a[i]。

MG规定所有a[i]构成了26个字母组成的排列。

MG现在需要知道这个随机串变换到自身的期望变换次数。请你输出期望答案乘上26^n以后模 1000000007的结果。

MG认为这件事非常容易,不屑于用计算机解决,于是运用他高超的人类智慧开始进行计算。作为一名旁观者,你也想挑战MG智慧,请你写个程序,计算答案。
输入描述
第一行一个整数T,代表数据组数(1 <=T<=10)。

接下来,对于每组数据——

第一行一个整数N,表示给定的随机串长度(1<=N<=1000000000)。

第二行26个字母,表示a_i​​序列
输出描述
对于每一组数据,输出一行。

显然,这个期望是一个实数。请你输出它乘上26^N​​以后模 1000000007 的结果
输入样例
2
2
abcdefghijklmnpqrstuvwxyzo
1
abcdefghijklmnopqrstuvwxyz
输出样例
5956
26
 

【分析】

  感觉BC的题挺好的啊【每次都能学到东西。。

  首先,知道,这是个带LCM的期望。就是看随机串分别在长度为几的循环节里面,然后LCM。

  然后,不同长度的循环节不会超过6个,1+2+3+4+5+6=21。

  就是根据输入的那个串,只会有6种长度的循环节,所以你可以枚举真正的随机串涵盖的循环节有哪几个,枚举是2^6。

  然后就是把n个字符放到那些循环节的字母集合中去,但是要保证每个循环节都一定有一个字母覆盖,问它的方案数。

  其实这是经典的容斥原理,就是n个东西分到m个集合,让每个集合都至少有一个东西。

  这里我们枚举子集就可以用容斥原理计算出来了【注意容斥,你要减掉的是没有涵盖某一个集合的,加上没有涵盖两个集合的。。。】

  枚举子集是3^n(用二项式定理易证)

  这个可以预处理的。

  所以是$O(2^6*\log(n)+3^6)$

官方题解:

 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define Mod 1000000007
#define LL long long int u[],v[],pp[],n;
LL sm[];
int h[],ss[],p[];
char s[];
bool vis[]; LL qpow(LL x,int b)
{
x%=Mod;
LL ans=;
while(b)
{
if(b&) ans=(ans*x)%Mod;
x=(x*x)%Mod;
b>>=;
}
return ans;
} void init()
{
memset(vis,,sizeof(vis));
memset(p,,sizeof(p));
memset(h,,sizeof(h));
memset(ss,,sizeof(ss));
scanf("%d",&n);
scanf("%s",s+);
for(int i=;i<=;i++) u[i]=s[i]-'a'+;
for(int i=;i<=;i++) if(!vis[i])
{
vis[i]=;
int x=i,cnt=;
while(u[x]!=i) x=u[x],cnt++,vis[x]=;
p[cnt]++;
}
v[]=;
for(int i=;i<=;i++) if(p[i]) v[++v[]]=i,pp[v[]]=p[i];
for(int i=;i<(<<v[]);i++)
for(int j=;j<=;j++) if(i&(<<j-)) ss[i]+=v[j]*pp[j],h[i]++;
for(int i=;i<(<<v[]);i++) sm[i]=qpow(ss[i],n);sm[]=;
int i;
// for(i=0;i<(1<<v[0]);i++)
for(i=(<<v[])-;i>=;i--)
for(int j=i;j;j=(j-)&i)
{
if(i==j) continue;
if((h[i]-h[j])%==) sm[i]+=sm[j];
else sm[i]-=sm[j];
sm[i]=(sm[i]%Mod+Mod)%Mod;
}
} LL gcd(LL a,LL b)
{
if(b==) return a;
return gcd(b,a%b);
} LL ans; void ffind(int x,int y,LL nw)
{
if(x==v[]+)
{
ans=(ans+sm[y]*nw)%Mod;
return;
}
ffind(x+,y,nw);
ffind(x+,y|(<<x-),nw*(LL)v[x]/gcd(nw,v[x]));
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
init();
ans=;ffind(,,);
printf("%lld\n",ans);
}
return ;
}

2017-04-02 10:41:18

【HDU 6021】 MG loves string (枚举+容斥原理)的更多相关文章

  1. hdu 6021 MG loves string (一道容斥原理神题)(转)

    MG loves string    Accepts: 30    Submissions: 67  Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  2. hdu 6021 MG loves string

    MG loves string Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others ...

  3. ●HDU 6021 MG loves string

    题链: http://acm.hdu.edu.cn/showproblem.php?pid=6021 题解: 题意:对于一个长度为 N的由小写英文字母构成的随机字符串,当它进行一次变换,所有字符 i ...

  4. MG loves string

    MG loves string Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others ...

  5. hdu 6020 MG loves apple 恶心模拟

    题目链接:点击传送 MG loves apple Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 262144/262144 K (Ja ...

  6. hdu6021[BestCoder #93] MG loves string

    这场BC实在是有趣啊,T2是个没有什么算法但是细节坑的贪心+分类讨论乱搞,T3反而码起来很顺. 然后出现了T2过的人没有T3多的现象(T2:20人,T3:30人),而且T2的AC率是惨烈的不到3% ( ...

  7. 【HDU 6020】 MG loves apple (乱搞?)

    MG loves apple  Accepts: 20  Submissions: 693  Time Limit: 3000/1500 MS (Java/Others)  Memory Limit: ...

  8. hdu 5656 CA Loves GCD(n个任选k个的最大公约数和)

    CA Loves GCD  Accepts: 64  Submissions: 535  Time Limit: 6000/3000 MS (Java/Others)  Memory Limit: 2 ...

  9. best corder MG loves gold

    MG loves gold  Accepts: 451  Submissions: 1382  Time Limit: 3000/1500 MS (Java/Others)  Memory Limit ...

随机推荐

  1. 判断是否引入jquery

    主要使用typeof检验 <script language="javascript"> if(typeof jQuery == 'undefined'){ window ...

  2. oozie与sqoop的简单案例

    1:拷贝模板 2:拷贝hive用的jar包 方式一: 3:编辑job.properties # # Licensed to the Apache Software Foundation (ASF) u ...

  3. SDUT 3917

    UMR 现在手里有 n 张康纳的表情,最上面一张是玛吉呀巴库乃.现在 UMR 如果每次把最上面的 m 张牌移到最下面而不改变他们的顺序及朝向,那么至少经过多少次移动玛吉呀巴库乃才会又出现在最上面呢? ...

  4. 自定义li项目符号

    使用background-image属性 先清除ul的默认list-style ul{ list-style:none } li{ background-image:url('./image/symb ...

  5. 一个爬取https和http通用的工具类(JDK自带的URL的用法)

    今天在java爬取天猫的时候因为ssl报错,所以从网上找了一个可以爬取https和http通用的工具类.但是有的时候此工具类爬到的数据不全,此处不得不说python爬虫很厉害. package cn. ...

  6. flask插件系列之flask_caching缓存

    前言 为了尽量减少缓存穿透,同时减少web的响应时间,我们可以针对那些需要一定时间才能获取结果的函数和那些不需要频繁更新的视图函数提供缓存服务,可以在一定的时间内直接返回结果而不是每次都需要计算或者从 ...

  7. Linux 添加普通用户到 sudoers 文件

    前言 Linux 的普通用户(uid >= 500)不具有某些命令的执行权限,为了执行较高权限的命令,一般有两种方法: 第一种是使用 su - 命令切换到 root 用户去执行: 另外一种方法是 ...

  8. Linux 用户态与内核态的交互【转载】

    Linux 用户态与内核态的交互  在 Linux 2.4 版以后版本的内核中,几乎全部的中断过程与用户态进程的通信都是使用 netlink 套接字实现的,例如iprote2网络管理工具,它与内核的交 ...

  9. Linux内存高,触发oom-killer问题解决

    最近遇到两起Linux的内存问题,其一是触发了oom-killer导致系统挂 1. 首先确认该系统的版本是32位 ? #uname -a Linux alarm 2.6.9-67.ELsmp #1 S ...

  10. oracle中的符号含义

    1.Oracle数据库存储过程中:=是什么意思?答:赋值的意思.举例:str := 'abcd';将字符串abcd赋值给变量str. 2.oracle 存储过程中的 := 和=有什么区别?答::= 是 ...