【HDU 6021】 MG loves string (枚举+容斥原理)
MG loves string
Accepts: 30Submissions: 67Time 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 (枚举+容斥原理)的更多相关文章
- hdu 6021 MG loves string (一道容斥原理神题)(转)
MG loves string Accepts: 30 Submissions: 67 Time Limit: 2000/1000 MS (Java/Others) Memory ...
- hdu 6021 MG loves string
MG loves string Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others ...
- ●HDU 6021 MG loves string
题链: http://acm.hdu.edu.cn/showproblem.php?pid=6021 题解: 题意:对于一个长度为 N的由小写英文字母构成的随机字符串,当它进行一次变换,所有字符 i ...
- MG loves string
MG loves string Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others ...
- hdu 6020 MG loves apple 恶心模拟
题目链接:点击传送 MG loves apple Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 262144/262144 K (Ja ...
- hdu6021[BestCoder #93] MG loves string
这场BC实在是有趣啊,T2是个没有什么算法但是细节坑的贪心+分类讨论乱搞,T3反而码起来很顺. 然后出现了T2过的人没有T3多的现象(T2:20人,T3:30人),而且T2的AC率是惨烈的不到3% ( ...
- 【HDU 6020】 MG loves apple (乱搞?)
MG loves apple Accepts: 20 Submissions: 693 Time Limit: 3000/1500 MS (Java/Others) Memory Limit: ...
- hdu 5656 CA Loves GCD(n个任选k个的最大公约数和)
CA Loves GCD Accepts: 64 Submissions: 535 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 2 ...
- best corder MG loves gold
MG loves gold Accepts: 451 Submissions: 1382 Time Limit: 3000/1500 MS (Java/Others) Memory Limit ...
随机推荐
- 【BZOJ】1711: [Usaco2007 Open]Dining吃饭
[算法]最大流 [题解] S连向食物连向牛连向牛‘连向饮料连向T. 经典的一个元素依赖于两个元素的建图方式. #include<cstdio> #include<algorithm& ...
- 【BZOJ】2142 礼物
[算法]中国剩余定理 [题意]给定n件物品分给m个人,每人分到wi件,求方案数%p.p不一定是素数. [题解] 首先考虑n全排列然后按wi划分成m份,然后对于每份内都是全排列,除以wi!消除标号影响, ...
- 计算1到N中各个数字出现的次数 --数位DP
题意:给定一个数n,问从1到n中,0~9这10个数字分别出现了多少次.比如366这个数,3出现了1次,6出现了2次. 题解:<剑指offer>P174:<编程之美>P132 都 ...
- styled-components真的好吗?
最近在学习react,然后遇到react中css该怎么写这个问题,上知乎上看了好多大牛都说styled-components好用是大势所趋. 但我自己用了感觉体验却很差,我在这里说说我为啥觉得styl ...
- C语言实现线性表(链式存储方式)
#include <stdio.h> #include <stdlib.h> //提供malloc()原型 typedef struct LNode *List; typede ...
- 解决 IE7 中 display:inline-block 失效的问题
我们在做首页菜单选项的时候,通常会用 li 标签去做,通过对 li 标签设置样式: display:inline-block 可以让 li 标签横排显示.但是这样做,在 IE7 浏览器下面会有一个兼容 ...
- E - Travel Cards CodeForces - 847K (思维)
题目链接:https://cn.vjudge.net/contest/272855#problem/E 题目大意:给你n,a,b,k,f.n代表有n次旅行计划,然后a代表一次单程旅行的车费,b代表从下 ...
- Fiddler 抓包工具总结(转)
阅读目录 1. Fiddler 抓包简介 1). 字段说明 2). Statistics 请求的性能数据分析 3). Inspectors 查看数据内容 4). AutoResponder 允许拦截制 ...
- offset宏的讲解【转】
转自:http://blog.csdn.net/tigerjibo/article/details/8299584 1.offset宏讲解 #define offsetof(TYPE, MEMBER) ...
- SQL 变量 条件查询 插入数据
(本文只是总结网络上的教程) 在操作数据库时 SQL语句中难免会用到变量 比如 在條件值已知的情況下 INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值 ...