2022暑期个人训练赛第09场

链接

A题:魔法部落

等比数列求和,问题在数据范围太大然后有除法的取模。
忘记逆元怎么求了,然后在草稿纸实验,发现除以2然后对1e9+7取模的话和乘(1e9+7)/2+1然后取模结果一样,此题解决

B题:圆盘

当时没有做

C题:棋盘行走

95分。

D题:走方格

这个是个前缀和,一开始没有考虑到去掉非最后一个格子会交换两人剩下的权值,然后30?数据这么水的吗
嗯,可以把数组开的稍微大点,可以在后续偷懒。
思路就是奇数偶数各自存一个前缀和,遍历一下,去掉第i点符合条件就ans++;

#include<iostream>
using namespace std;
typedef unsigned long long ll;
ll ans,n;
int suma[200010],sumb[200010];
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		int x;
		cin>>x;
		suma[i]=suma[i-1];
		sumb[i]=sumb[i-1];
		if(i%2)
			suma[i]+=x;
		else sumb[i]+=x;
	}
	for(int i=1;i<=n;i++)
	{
		if(i==1&&sumb[n]==suma[n]-suma[1])ans++;
		else if(suma[i-1]+sumb[n]-sumb[i]==sumb[i-1]+suma[n]-suma[i])ans++;
	}
	cout<<ans;
	return 0;
}

E题:滑稽果

没有做

F题:数列

没有做

G题:小球

没有做

H题:游戏

没有做

I题:T-shirt

水题,if else解决的那种

J题:Minimize Ordering

也有点水,意思是给你一段字符串,让你输出最小字典序的排列
直接,sort下就可了,中间用个int数组过渡下

K题:1111gal password

要求相邻两位之间差值不大于1,设a[i][j]是第i位选j的种数,我们不难想出 a[i][j]=a[i-1][j-1]+a[i-1][j]+a[i-1][j+1]
可以把数组设大点,偷懒而且防止re,最后ans是a[n][i]累加,注意最后输出一定要取余,,不然就像我这样wa一次了

#include<iostream>
#include<cmath>
using namespace std;
typedef unsigned long long ll;
ll ans,n;
const ll mod=998244353;
ll a[2000001][11];
int main()
{
	cin>>n;
	for(int i=1;i<=9;i++)a[1][i]=1;
	for(int i=2;i<=n;i++)
	{
		for(int j=1;j<=9;j++)
		{
			a[i][j]=a[i-1][j-1]%mod+a[i-1][j+1]%mod+a[i-1][j]%mod;
			a[i][j]%=mod;
		}
	}
	ll ans=0;
	for(int i=1;i<=9;i++)ans+=(a[n][i]%mod);
	cout<<ans%mod;
	return 0;
}

剩下的,还没做有空再补

posted @ 2022-07-19 21:09  qbning  阅读(20)  评论(0编辑  收藏  举报
描述