列表

详情


NC250240. 嘤嘤的可爱(hard)

描述

        本题与easy版区别只在于 k 的数据范围不同,并且保证easy版的测试用例是hard版的测试用例的子集。

        嘤嘤有一个只由小写字母组成的字符串,她希望把这个字符串变得跟她一样可爱。

        嘤嘤有一个魔法,可以将字符串中的一个小写字母变成一个小写字母(**可以和原字母相同**),这个魔法可以使用 k 次。

        一个字符串的可爱值定义为这个字符串中含有的 'y' , 'k' , 'a' , 'w' , 'i' 这五种字母的数量,例如"yykawaii"的可爱值是8,"zjkgg"的可爱值是1,而"qcjj"的可爱值……

        由于嘤嘤正在被qcjj追杀,所以嘤嘤留下的魔法只能随机使用了(随机将字符串中的一个小写字母随机变成一个小写字母,可能和原字母相同)。

        现在,嘤嘤给出字符串和 k ,她想知道她的字符串在随机使用 k 次魔法后,可爱值的期望是多少。

        PS:qcjj其实非常可爱哦!(绝对不是qcjj要我加的)附一张嘤嘤头像同款的爱莉神教图。

        世界名画——《粉色妖精小姐?嗯……如果你真的很想用这个称呼……那我当然是欣然接受啦♪》(爱莉希雅)(图片加载失败)

输入描述

第一行给出两个整数 n(1 \le n \le 10^6),k(0 \le k \le 10^{18}) ,分别表示嘤嘤的字符串的长度和可以使用魔法次数。

第二行给出一个长度为 n 的只由小写字母组成的字符串 s ,表示嘤嘤的字符串。

输出描述

输出可爱值的期望对 10^9+7 取模的结果。

示例1

输入:

8 0
yykawaii

输出:

8

示例2

输入:

4 4
qcjj

输出:

309495195

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 30ms, 内存消耗: 3120K, 提交时间: 2023-04-14 23:02:23

#include<bits/stdc++.h>

using namespace std;

using LL = long long;

const LL M = 1e9+7;

int main(){
	LL n,k;
	cin>>n>>k;
	string s;
	cin>>s;
	auto ksm = [&](LL x,LL y){
		LL ans = 1;
		while(y){
			if(y&1) ans = ans * x % M;
			x = x * x % M;
			y >>= 1;
		}
		return ans;
	};
	LL ans = 0;
	LL p0 = 1 * ksm(n-1 , k) * ksm(ksm(n,k) , M-2) % M;
	LL t = 5 * ksm(26 , M-2) % M;
	LL p1 = (1 - p0 + M) % M;
	for(auto &i : s){
		if(i=='y' || i=='k' || i=='a' || i=='w' || i=='i') ans += p0;
		ans += p1*t;
		ans %= M;
	}
	cout<<ans<<endl;
	return 0;
}

C++(clang++ 11.0.1) 解法, 执行用时: 9ms, 内存消耗: 1624K, 提交时间: 2023-04-14 20:12:09

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 1000000007
ll ksm(ll x,ll p){
	ll res=1;
	for(;p;p>>=1,x=x*x%mod) if(p&1) res=res*x%mod;
	return res;
}
ll inv(ll x){
	return ksm(x,mod-2);
}
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	ll n,m;
	cin>>n>>m;
	string s;
	cin>>s;
	ll x=0;
	for(int i=0;i<n;i++) if(s[i]=='y'||s[i]=='k'||s[i]=='a'||s[i]=='w'||s[i]=='i') x++;
	ll k=(mod-inv(n)+1)%mod;
	ll b=5*inv(26)%mod;
	x=(ksm(k,m)*x+b*(1-ksm(k,m))%mod*inv(1-k)%mod+mod)%mod;
	cout<<x;
}

pypy3 解法, 执行用时: 105ms, 内存消耗: 49388K, 提交时间: 2023-04-14 19:25:02

import sys
import os
import io

input = io.BytesIO(os.read(0, os.fstat(0).st_size)).readline
output = sys.stdout.buffer.write


def print(*values, sep=" ", end="\n"):
    output(sep.join(str(value) for value in values).encode())
    output(end.encode())


mod = 1000000007
n, k = map(int, input().split())
p = pow(1 - pow(n, mod - 2, mod), k, mod)
q = 5 * pow(26, mod - 2, mod)
ans = (1 - p) * q * n % mod
for c in input().strip():
    if c in b"kawyi":
        ans += p
print(ans % mod)

上一题