ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

AtCoder Beginner Contest 200 F

2022-07-09 20:02:36  阅读:159  来源: 互联网

标签:AtCoder return Beginner 200 ll ret frac mod define


这题的思路很清晰,和这题类似。

我们先考虑不将它重复\(k\)次,即字符串\(S\)所有的方案的和的平均数

首先,若没有?\(最少的次数=\lceil\frac{相邻两个数不同的个数}{2}\rceil\),那我们将每两个不同的字符的贡献看成\(\frac 1 2\),由于若相邻的不同的个数为奇数时要向上取整,我们发现,此时\(S_{|S|}\)和\(S_{1}\)一定不是同一个数,比如下面的情况

11100011000

所以,我们把\(|S|\)和\(1\)看成也是相邻的即可(类似环)。

?呢?

  • ?+0/1 或 0/1+?,可以计算贡献为\(\frac 1 4\)。

  • ?+?

    • 0+01+1贡献为0;
    • 0+11+0贡献为1。

    即,总的贡献仍为\(\frac 1 4\)。

这样,我们计算出所有\(S\)的答案的平均数\(num\),我们先将其乘\(k\)(重复\(k\)次),得到重复\(k\)次的平均数。而我们有\(2^{kq}\)种方案,\(q\)指\(S\)中的?的数量。所以,答案为:

\[num\times k\times 2^{kq} \]

注意:

当\(|S|=1\)且\(k=1\)时,不存在相邻的字符,我们应特判,输出0

代码:

#include<bits/stdc++.h>
using namespace std;

#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define sz(v) (int)(v).size()
#define all(v) (v).begin(),(v).end()

typedef long long ll;
typedef pair<int,int> pi;

const ll mod=1000000007;
const ll inv2=500000004,inv4=250000002;
ll k,cnt,ans;
string s;

ll qpow(ll x,ll y) {
	if(y==0ll) return 1;
	ll ret=qpow(x,y>>1ll);
	ret*=ret,ret%=mod;
	if(y&1ll) ret*=x,ret%=mod;
	return ret;
}

ll calc(char x,char y) {
	if(x=='?'||y=='?') return inv4;
	if(x!=y) return inv2;
	return 0;
}

int main() {
	cin>>s>>k;
	if(sz(s)==1&&k==1) {
		puts("0");
		exit(0);
	}
	for(int i=0;i<sz(s);i++) {
		ans+=calc(s[i],s[(i+1)%sz(s)]);
		cnt+=(s[i]=='?');
		ans%=mod;
	}
	ans=ans*k%mod*qpow(2ll,cnt*k)%mod;
	cout<<ans<<endl;
	return 0;
}

标签:AtCoder,return,Beginner,200,ll,ret,frac,mod,define
来源: https://www.cnblogs.com/Nastia/p/16461759.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有