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想把这个图删干净,它的方法是这样的.每次选择一个点,将它删掉,但删这个点是需要代价的.假 ...
随机推荐
- 【搜索】n的约数
题目链接:传送门 [题解]: 考察dfs和质因数分解,首先开一个prime数组. 参数解释: 1.当前值的大小.[利用题目的n来控制范围] 2.控制下界,每次都是以某一个质数开始搜索, pos 3.控 ...
- kafka常见问题
(1) 如果想消费已经被消费过的数据 consumer是底层采用的是一个阻塞队列,只要一有producer生产数据,那consumer就会将数据消费.当然这里会产生一个很严重的问题,如果你重启一消费 ...
- 2017多校赛 Function
Function Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total ...
- finally代码块的执行
try{ //todo }catch(Exception e){ //todo }finally{ //todo } 1.不管try,catch里面的代码快有无return,finally都会执行 2 ...
- springboot-异步、发送邮件(一)
pom.xml <!--邮件javax.mail--> <dependency> <groupId>org.springframework.boot</gro ...
- 修改小程序checkbox样式
未选中时的样式 checkbox .wx-checkbox-input { border-radius: 50%; height: 30rpx; width: 30rpx; margin-top: - ...
- fetch---基本使用
一.fetch fetch是一种XMLHttpRequest的一种替代方案,在工作当中除了用ajax获取后台数据外我们还可以使用fetch.axios来替代ajax 二.安装 执行npm instal ...
- 5.1 Request 获取请求数据的几种方法
//获取请求头和请求数据 //请求数据(1.通过超链接 2.通过表单) //获取请求数据的时候一般来说 都要先检查 再使用 public class RequestDemo2 extends Http ...
- wordpress程序打开太慢的解决方案(一步搞定)
周末两天没有打开自己的赵一鸣随笔博客,今天访问了一下,打开速度太慢了,看看浏览器栏目,网站标题已经显示出来了,但是网页却是一片空白,什么都没有,刚开始以为是我们公司网速的问题,就没有特别注意这件事情. ...
- mock.js学习之路(二)easy-mock(Vue中使用)
1.easy-mock建立外部数据,注册账号,创建数据,详细使用过程参照https://www.easy-mock.com/docs文档说明 2.项目中如何引入使用 ①配置一下config.index ...