首页 > 其他分享 >Atcoder Regular Contest 124 E - Pass to Next

Atcoder Regular Contest 124 E - Pass to Next

时间:2023-07-21 12:33:14浏览次数:40  
标签:Atcoder Contest int Next 传过来 答案 序列 dp MOD

首先第一步是一个浅显的观察:我们要求的是所有可能的最终序列的贡献之和,如果能改为计算所有操作序列的贡献之和那问题会简单很多,并且我们惊奇地发现,如果一组 \(x_i\) 全大于 \(0\),那么把它们全减去 \(1\) 以后得到的答案序列不会改变,而对于任意一种可能的最终序列,必然存在一组 \(\min x_i=0\) 的操作序列能够得到这个答案序列。也就是说我们建立了一组 \(\min x_i=0\) 的答案序列到操作序列的映射。那么具体怎么计算这个东西呢?我们计算所有操作序列的答案之和,再将所有 \(b_i\) 减一,计算新的操作序列之和,二者做差就是答案。

转换贡献体,改为每个人选一个目前在手中的球,计算选择的方案数。

每个人选择的球有两种情况,一是上一个人传过来的,二是自己原有的。

先考虑链的情况,我们设 \(dp_{i,0/1}\) 表示考虑到第 \(i\) 个人,第 \(i\) 个人考虑自己原有的 / 上一个人传过来的球的方案,所有已经确定贡献的方案数。注意,之所以说已经确定的贡献,是因为如果第 \(i\) 个人考虑自己原有的球,那么有可能下一个人考虑上一个人(也就是 \(i\))传过来的球,那么我们把第 \(i\) 个人传球的方案放到 \(i+1\) 那里计算,这样第 \(i\) 个人的方案就不算“已经确定贡献”的方案。转移显然:

  • \(dp_{i-1,1}·(a_i+1)\to dp_{i,0}\)
  • \(dp_{i-1,0}·(\sum_{j=0}^{a_i} j)\to dp_{i,0}\)
  • \(dp_{i-1,1}·(\sum_{j=0}^{a_i} j)\to dp_{i,1}\)
  • \(dp_{i-1,0}·(\sum_{j=0}^{a_i} (a_i-j)·j)\to dp_{i,1}\)

还有一个问题就是环的情况。其实很简单,强制钦定第 \(1\) 个人是原有的还是传过来的就行了。代码里有个 \(-1\) 是因为我给 \(dp_{1,c1}\) 赋了 \(1\) 的初值,这个初值不能算入答案。

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5;
const int MOD=998244353;
const int INV6=(MOD+1)/6;
int n,a[MAXN+5],dp[MAXN+5][2];
int getsum1(int x){return 1ll*x*(x+1)/2%MOD;}
int getsum2(int x){return 1ll*x*(x+1)%MOD*(2*x+1)%MOD*INV6%MOD;}
int calc(int c1,int c2){
	memset(dp,0,sizeof(dp));dp[1][c1]=1;
	for(int i=1;i<=n;i++){
		dp[i%n+1][0]=(1ll*dp[i][0]*getsum1(a[i]-c2)+1ll*dp[i][1]*(a[i]-c2+1))%MOD;
		dp[i%n+1][1]=(1ll*dp[i][0]*(1ll*a[i]*getsum1(a[i])%MOD-getsum2(a[i])+MOD)+1ll*dp[i][1]*getsum1(a[i]))%MOD;
	}return (dp[1][c1]-1+MOD)%MOD;
}
int main(){
	scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	printf("%d\n",(0ll+calc(0,0)+calc(1,0)-calc(0,1)-calc(1,1)+MOD+MOD)%MOD);
	return 0;
}

标签:Atcoder,Contest,int,Next,传过来,答案,序列,dp,MOD
From: https://www.cnblogs.com/tzcwk/p/arc124E.html

相关文章

  • Atcoder Grand Contest 057 D - Sum Avoidance
    先来找些性质:\(A\)中最小的元素\(M\)肯定是最小的不是\(S\)的因子的数,由于\(\text{lcm}(1,2,3,\cdots,43)>10^{18}\),所以\(M\le43\)。对于每个\(0\lei<M\),\(\bmodM=i\)的数被选择的部分必然是一段后缀,因为如果你选择了\(M\)选择了某个\(\bmodM=i\)的数\(v\),......
  • linux awk 命令中 next 和 getline
     001、continue[root@PC1test01]#lsdata[root@PC1test01]#catdata##测试数据1000naughty500cc400zoer100[root@PC1test01]#awk'{if(NR==2){next};print$0}'data##next相当于内层循环的continue,表示跳过该次迭代1000cc400zoer100......
  • AtCoder Grand Contest 049 E Increment Decrement
    洛谷传送门AtCoder传送门好题。同时考查了slopetrick和选手的计数能力,不愧是AGCE。先考虑问题的第一部分。你现在有一个初始全为\(0\)的序列\(b\)。你每次可以给\(b\)单点\(\pm1\),代价为\(1\),或区间\(\pm1\),代价为\(m\)。求把\(b\)变成给定序列\(a\)的......
  • AtCoder Beginner Contest 310
    A-OrderSomethingElse#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongint32_tmain(){ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);intn,p,q;cin>>n>>p>>q;......
  • 魔法方法之__iter__(self) && __next__(self)
    __iter____iter__(self)是一个特殊方法,用于返回一个迭代器对象,使得自定义的类可以支持迭代操作。最佳实践:在自定义类中实现 __iter__() 方法时,应该返回一个迭代器对象,通常是自身的实例。迭代器对象应该实现 __next__() 方法,用于返回容器中的下一个元素,并在没有更多元素......
  • 【2023.07.14】Atcoder:past201912 - 第一回 アルゴリズム実技検定(div4+区域赛难度)过题
    G-Division解法一:位运算+状压枚举(赛时思路)范围显然,可以跑\(2^n\)的算法,考虑位运算状态压缩。以\(\mathcalO(2^n\cdot2^n)\)的复杂度分别枚举位于第一组、第二组中的人,随后计算每一种分组的快乐值,代码较长,赛时敲了半个小时,不过好在一发过了。总结:其实代码里面的剪枝完......
  • freee Programming Contest 2023(AtCoder Beginner Contest 310)
    Preface打的就是依托答辩,当时看一眼D感觉是个爆搜不想写就先跳了去想F,结果傻逼了没想出来最后30min了赶紧溜回去把D爆搜写了,但是已经罚时爆炸了,其实如果正常正序做的话排名会挺稳的后面一问包大爷发现F是个傻逼题,只能说计数水平实在是低下A-OrderSomethingElse签到题#i......
  • SMU Summer 2023 Contest Round 4
    SMUSummer2023ContestRound4A-TelephoneNumber思路:满足有8,且8后有大于等于11个数#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongtypedefpair<int,int>PII;typedefpair<string,int>PSI;typedefpair<char,int>PCI;type......
  • SMU Summer 2023 Contest Round 4
    SMUSummer2023ContestRound4A.TelephoneNumber满足第一个8后面存在10个字符即可#include<bits/stdc++.h>#defineendl'\n'#defineintlonglongusingnamespacestd;intn,m;voidsolve(){cin>>n;strings;cin>>s;......
  • AtCoder Beginner Contest 310
    PeacefulTeams\(n\)个运动员,要分成\(t\)个队伍,一共有\(m\)对人不能放在一支队伍里,求方案数,每支队伍至少需要有一个人\(1\leqt\leqn\leq10\)题解:DFS搜索通过数据范围考虑爆搜我们考虑枚举的顺序\(O(n!)\)我们对每个人\(c\)枚举将其加到当前的\(d\)支队伍中新开一......