MG loves string

 

 Accepts: 30    Submissions: 67

 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)

问题描述

MGMG是一个很忙碌的男孩子。今天他沉迷于这样一个问题:

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

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

MGMG现在需要知道这个随机串变换到自身的期望变换次数。请你输出期望答案乘上26^n26

​n

​​ 以后模 10000000071000000007 的结果。

MGMG认为这件事非常容易,不屑于用计算机解决,于是运用他高超的人类智慧开始进行计算。作为一名旁观者,你也想挑战MGMG智慧,请你写个程序,计算答案。

输入描述

第一行一个整数TT,代表数据组数(1 <=T<=101<=T<=10)。

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

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

第二行2626个字母,表示a_ia

​i

​​ 序列

输出描述

对于每一组数据,输出一行。

显然,这个期望是一个实数。请你输出它乘上26^N26

​N

​​ 以后模 10000000071000000007 的结果

输入样例

2

2

abcdefghijklmnpqrstuvwxyzo

1

abcdefghijklmnopqrstuvwxyz

输出样例

5956

26

题解请参考这位大神:

https://blog.csdn.net/junior19/article/details/71599520

他的代码:

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<string>
#include<vector>
#include<deque>
#include<queue>
#include<algorithm>
#include<set>
#include<map>
#include<stack>
#include<ctime>
#include<string.h>
#include<math.h>
#include<list> using namespace std; #define ll long long
#define pii pair<int,int>
const int inf = 1e9 + 7; char to[27];
bool vis[27];
vector<pii>loop;//fist 循环节长度为first 有second个循环节长度为first void calLoop(){
for(int i=0;i<26;++i){
to[i]-='a';
}
map<int,int>mp;
fill(vis,vis+27,0);
loop.clear();
for(int i=0;i<26;++i){
if(vis[i]==0){
vis[i]=1;
int ans=1;
int x=to[i];
while(x!=i){
vis[x]=1;
++ans;
x=to[x];
}
mp[ans]+=1;
}
}
for(auto it=mp.begin();it!=mp.end();++it){
loop.push_back(*it);
}
} ll lcm(ll a,ll b){
ll tmp=__gcd(a,b);
return a/tmp*b;
} ll quickMulti(ll a,ll n){
ll ans=1;
ll t=a%inf;
while(n){
if(n&1){
ans=(ans*t)%inf;
}
t=(t*t)%inf;
n>>=1;
}
return ans;
} inline ll mod(ll x){
return (x%inf+inf)%inf;
} ll f(vector<int>&vec,int n){//容斥
ll ans=0;
int nv=vec.size();
for(int i=1,end=1<<nv;i<end;++i){
ll flag=-1;
int sum=0,num=0;
for(int j=0;j<nv;++j){
if((1<<j)&i){
sum+=vec[j];
++num;
}
}
if(num%2==nv%2){
flag=1;
}
ll t=quickMulti(sum,n);
ans=(ans+mod(flag*t))%inf;
}
return ans;
} ll slove(int n){
calLoop();
ll ans=0;
vector<int>vec;//当前选择了的循环节包含的字母数
for(int i=1,end=1<<loop.size();i<end;++i){//枚举循环节的状态
ll ans1=1;//选择了这几个循环节的贡献
vec.clear();
for(int j=0;j<loop.size();++j){
if((1<<j)&i){
ans1=lcm(ans1,loop[j].first);
vec.push_back(loop[j].first*loop[j].second);
}
}
if(vec.size()>n){
continue;
}
ll ans2=f(vec,n);
ans=(ans+ans1*ans2)%inf;
}
return ans;
} int main()
{
//freopen("in.txt","r",stdin);
//freopen("/home/lu/Documents/w.txt","w",stdout);
int T;
scanf("%d",&T);
while(T--){
int n;
scanf("%d%s",&n,to);
printf("%lld\n",slove(n));
}
return 0;
}

hdu 6021 MG loves string (一道容斥原理神题)(转)的更多相关文章

  1. hdu 6021 MG loves string

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

  2. ●HDU 6021 MG loves string

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

  3. 【HDU 6021】 MG loves string (枚举+容斥原理)

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

  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. 【CZY选讲·一道图论神题】

    题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图,只有点权. LYK想把这个图删干净,它的方法是这样的.每次选择一个点,将它删掉,但删这个点是需要代价的 ...

  8. 一道背包神题-Petrozavodsk Winter-2018. Carnegie Mellon U Contest Problem I

    题目描述 有\(n\)个物品,每个物品有一个体积\(v_i\),背包容量\(s\).要求选一些物品恰好装满背包且物品个数最少,并在这样的方案中: (1)求出中位数最小的方案的中位数(\(k\)个元素的 ...

  9. 清北学堂模拟赛d2t1 一道图论神题(god)

    题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图,只有点权. LYK想把这个图删干净,它的方法是这样的.每次选择一个点,将它删掉,但删这个点是需要代价的.假 ...

随机推荐

  1. vue—组件通信,ref

    组件通信: 父组件传递子组件: 把需要的数据 传递给 子组件的数据,以数据绑定(v-bind)的形式,传递到子组件内部,供子组件使用,缩写(:) 动态传递: 第一步:在父组件中的子组件标签中进行动态的 ...

  2. 火狐 , IE , 谷歌浏览器的 驱动下载地址汇总

    一.Firefox和驱动下载地址 所有火狐浏览器版本下载地址:http://ftp.mozilla.org/pub/firefox/releases/ 所有火狐驱动geckodriver版本下载地址: ...

  3. WPF入门(3)——命令

    命令是ICommand类型的属性,binding到控件上,用于代替事件,个人认为事件也很好,命令只是轻度解耦前后端. 闲话少说,上代码,示例是ScreenToGif的源代码中的一个命令: public ...

  4. JAVA生成验证码代码

    生成base64格式图片验证码 /** * 验证码的候选内容 */ private char codeSequence[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', ...

  5. element-ui当中table组件的合并行和列的属性:span-method的用法

    背景 最近基本上都是以Vue来构建项目,而UI框架也基本上都是使用的element-ui,所以里面组件用的也是越来越多,今天想记录的是非常非常小的一个属性的用法. Table组件 Table组件用了真 ...

  6. python 拟合曲线并求参

    需要对数据进行函数拟合,首先画一下二维散点图,目测一下大概的分布, 所谓正态分布,就是高斯分布,正态曲线是一种特殊的高斯曲线. python的scipy.optimize包里的curve_fit函数来 ...

  7. 关于spring中事务管理的几件小事

    1.Spring中的事务管理 作为企业级应用程序框架,Spring在不同的事务管理API之上定义了一个抽象层.而应用程序开发人员不必了解底层的事务管理API,就可以使用Spring的事务管理机制. S ...

  8. vue.js devtools图标不亮

    第一步:打开谷歌扩展程序 第二步:设置允许访问文件地址

  9. 使用高德地图JS获取当前位置和经纬度

    先看效果,我做的是这样的,可以按地图位置来返回当前你点的位置(图一,二),也可以根据输入框的自动搜索(图三,四) HTML的代码: <div> <input type="t ...

  10. FlowPortal BPM 安装环境的配置

    l  操作系统:Windows Server 2003 及以上: l  IIS: 在Internet信息服务(IIS)管理器中将ISAPI和CGI限制全部设为“允许” l  需要安装.Net Fram ...