hdu 6021 MG loves string (一道容斥原理神题)(转)
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 (一道容斥原理神题)(转)的更多相关文章
- 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 ...
- 【HDU 6021】 MG loves string (枚举+容斥原理)
MG loves string Accepts: 30 Submissions: 67 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: ...
- 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% ( ...
- 【CZY选讲·一道图论神题】
题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图,只有点权. LYK想把这个图删干净,它的方法是这样的.每次选择一个点,将它删掉,但删这个点是需要代价的 ...
- 一道背包神题-Petrozavodsk Winter-2018. Carnegie Mellon U Contest Problem I
题目描述 有\(n\)个物品,每个物品有一个体积\(v_i\),背包容量\(s\).要求选一些物品恰好装满背包且物品个数最少,并在这样的方案中: (1)求出中位数最小的方案的中位数(\(k\)个元素的 ...
- 清北学堂模拟赛d2t1 一道图论神题(god)
题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图,只有点权. LYK想把这个图删干净,它的方法是这样的.每次选择一个点,将它删掉,但删这个点是需要代价的.假 ...
随机推荐
- Technocup 2020 - Elimination Round 1补题
慢慢来. 题目册 题目 A B C D tag math strings greedy dp 状态 √ √ √ √ //∅,√,× 想法 A. CME res tp A 题意:有\(n\)根火柴,额外 ...
- 5.Linux常用排查命令
可以使用一下命令查使用内存最多的10个线程 ps aux | sort -k4nr | head -n 10 可以使用一下命令查使用CPU最多的10个线程 ps aux | sor ...
- ideaIU-2019.2.exe-安装目录和设置目录结构的说明
一.查看安装目录结构 bin: 容器,执行文件和启动参数等 help:快捷键文档和其他帮助文档 jbr: 含有java运行环境 lib:idea 依赖的类库 license:各个插件许可 plugin ...
- dev linechart动态加载数据(像股票一样的波动)
图片地址:https://blog.csdn.net/qq_33459369/article/details/80060196:(盗图) 接下来是封装的代码 #region 动态折线图 public ...
- css三大特性及权重说明
一.三大特性简述 层叠性: 后来的覆盖前面的 (长江后浪推前浪) 继承性: 子标签会继承父标签的某些样式 (跟文字有关的一般都会继承) 优先级: 设计到一个算法“css特殊性(Specificity) ...
- Jboss未授权访问部署木马 利用exp
查看系统名称 java -jar jboss_exploit_fat.jar -i http://www.any.com:8080/invoker/JMXInvokerServlet get jbos ...
- 4.SpringMVC 配置式开发-处理器映射器
处理器映射器 HandlerMapping HandlerMapping 接口负责根据request请求找到对应的Handler处理器及Interceptor拦截器, 并将它们封装在HandlerEx ...
- 测试clang-format的格式化效果
我自己写的业余框架已告一段落,主体功能已完成,剩下的就是优化.第一个要优化的,就是代码格式.我一直是用编辑器写代码的,从之前的UltraEdit到notepad++到sublime text,再到现在 ...
- persistence.xml模板配置
1.右键创建的persistence.xml 2.选择2.0版本的模板 3.复制右侧代码,写入xml文件中 <?xml version="1.0" encoding=&quo ...
- PAT Basic 1087 有多少不同的值 (20 分)
当自然数 n 依次取 1.2.3.…….N 时,算式 ⌊ 有多少个不同的值?(注:⌊ 为取整函数,表示不超过 x 的最大自然数,即 x 的整数部分.) 输入格式: 输入给出一个正整数 N(2). 输出 ...