目录

abc171

A - αlphabet

题意

看题目

题解

1
2
3
4
5
6
7
8
#include<bits/stdc++.h>
using namespace std;
int main(){
	char a;
	cin>>a;
	if(isupper(a)) cout<<'A';else cout<<'a';
	return 0;
}

B - Mix Juice

题意

看题目

题解

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#include<bits/stdc++.h>
using namespace std;
int main(){
	int n,k;
	cin>>n>>k;
	int a[n];
	for(int i=0;i<n;i++) cin>>a[i];
	sort(a,a+n);
	int ans = 0;
	for(int i=0;i<k;i++) ans+=a[i];
	cout<<ans<<endl;
	return 0;
}

C - One Quadrillion and One Dalmatians

题意

类似于十进制转26进制

不同的是27是 aa

题解

这个题目没有像正常的转化那样进位

所以对每一位求值前先减1

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
int main(){
	ll a;
	cin>>a;
	string s = "";
	//a--;
	while(a!=0){
		a--;
		s += (a%26) + 'a';
		a /= 26;
	}
	reverse(s.begin(),s.end());
	cout<<s<<endl;
    return 0;
}

D - Replacing

题意

看题目

题解

模拟

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<bits/stdc++.h>
using namespace std;
long long a[100005];
int main(){
    long long n;
    cin>>n;
    long long sum = 0;
    for(long long i=0;i<n;i++) {
    	long long x;
    	cin>>x;
    	a[x]++;
    	sum+=x;
	}
	long long q;
	cin>>q;
	for(long long i=0;i<q;i++){
		long long t,y;
		cin>>t>>y;
		sum+=((y-t)*a[t]);
		
		cout<<sum<<endl;
		a[y]+=a[t];
		a[t] = 0;
		
	}
    return 0;
}

E - Red Scarf

题意

对于一个数列,第一个位置的值是原数列其他位置的异或,依此类推

还原数列

题解

利用异或性质

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#include<bits/stdc++.h>
using namespace std;
int a[200005];
int main()
{
	int n;
	cin>>n;
	int ans = 0;
	for(int i=0;i<n;i++){
		cin>>a[i];
		ans ^= a[i];
	}
	for(int i=0;i<n;i++){
		cout<<(ans^a[i])<<" ";
	}cout<<endl;
	return 0;
}

F - Strivore

题意

看题目

题解

把问题转化成满足长度为n的,包含子序列s的字符串有几个

然后就变成排列组合题

考虑所有情况减去不包含子序列s的字符串

不含子序列s的字符串可以这样构造

目标串T可以包含子序列中的1个,2个,3个。。。s.length() - 1个

这样取子序列只能是前几个,因为取s的中间部分就一定不满足条件

对于其中一种情况,举个例子

s = " acf" 总长度为8

假设从s中选两个,那这两个就一定是 a c

假设它们被安排在这样的位置

12a45c78

那么1号和2号一定不能选到a,4号和5号一定不能选到c,7号和8号一定不能选到f

这样T就一定没有子序列s

对于除ac外的位置都有25种选择

所以这种情况(选两个)就有

$$ C_{8}^{2} * 25^6 $$

种方案

所以对于所有情况(n是T的长度,s是子序列的长度),方案数

$$ 26^{n} - \sum\limits_{i=0} ^ {s-1} {C_n^i*25^{n-i}} $$

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const ll mod = 1e9+7;
ll fac[2000005];
ll qpow(ll x,ll n)
{
    ll res =1;
    while(n>0)
    {
        if(n&1) res=res*x%mod;
        x=x*x%mod;
        n>>=1;
    }
    return res;
}
ll C(ll n,ll m){
	return fac[n]*qpow(fac[m] , mod-2)%mod*qpow(fac[n-m] , mod-2)%mod;
}
int main(){
	fac[0] = 1;
	fac[1] = 1;
	for(ll i=2;i<2000002;i++){
		fac[i] = i * fac[i-1];
		fac[i] %= mod;
	}
	ll k;
	cin>>k;
	string ss;
	cin>>ss;
	ll s = ss.size();
	ll ans = 0;
	for(ll i=0;i<s;i++){
		ans += C(k+s , i) * qpow(25 , k+s-i);
		ans %= mod;
	}
	cout<<(qpow(26 , k+s) - ans + mod) % mod<<endl;
	return 0;
}

如果用逆元

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
inline ll C(ll m,ll n){
    return fac[n]*inv[m]%mod*inv[n-m]%mod;
}

inv[0]=1;inv[1]=1;      //inv[0]=1 !!! 
    for(ll i=2;i<=n;i++){
        inv[i]=(mod-mod/i)*inv[mod%i]%mod;
    }
    for(ll i=2;i<=n;i++){
        inv[i]=(inv[i]*inv[i-1])%mod;
    }