首页 > 其他分享 >2022 China Collegiate Programming Contest (CCPC) Guilin Site

2022 China Collegiate Programming Contest (CCPC) Guilin Site

时间:2022-11-01 11:24:22浏览次数:97  
标签:Contest int Guilin Site long times define

比赛链接

2022 China Collegiate Programming Contest (CCPC) Guilin Site

C. Array Concatenation

给定一个长度为 \(n\) 的数组 \(b_i\),有两种操作变换:

  • \(b^{\prime}=\left\{b_1, b_2, \ldots, b_{|b|}, b_1, b_2, \ldots, b_{|b|}\right\}\)
  • \(b^{\prime}=\left\{b_{|b|}, b_{|b-1|}, \ldots, b_1, b_1, b_2, \ldots, b_{|b|}\right\}\)

问 \(m\) 次操作后数组的所有前缀的和模 \(10^9+7\) 后的最大值

解题思路

思维

假设长度为 \(n\) 的数组,其和为 \(s\),所有前缀和为 \(ss\),所有后缀和为 \(sss\)
可以发现:当有操作 \(2\) 时,当前数组会变成回文数组,后面无论哪一种操作都不影响结果,且只要有操作 \(2\),其结果都一定,操作 \(m\) 次,最终结果为 \(2^{m-1}\times (ss+sss)+\frac{2^m\times (2^m-1)}{2}\times n\times s\),只有第一种操作的最终结果为 \(2^{m}\times ss+\frac{2^m\times (2^m-1)}{2}\times n\times s\),两种结果取 max 即为答案
另外,这里很容易爆 long long,直接 __int128

  • 时间复杂度:\(O(logm)\)

代码

// Problem: C. Array Concatenation
// Contest: Codeforces - 2022 China Collegiate Programming Contest (CCPC) Guilin Site
// URL: https://codeforces.com/gym/104008/problem/C
// Memory Limit: 512 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

// %%%Skyqwq
#include <bits/stdc++.h>
 
// #define int long long
#define help {cin.tie(NULL); cout.tie(NULL);}
#define pb push_back
#define fi first
#define se second
#define mkp make_pair
using namespace std;
 
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;
 
template <typename T> bool chkMax(T &x, T y) { return (y > x) ? x = y, 1 : 0; }
template <typename T> bool chkMin(T &x, T y) { return (y < x) ? x = y, 1 : 0; }
 
template <typename T> void inline read(T &x) {
    int f = 1; x = 0; char s = getchar();
    while (s < '0' || s > '9') { if (s == '-') f = -1; s = getchar(); }
    while (s <= '9' && s >= '0') x = x * 10 + (s ^ 48), s = getchar();
    x *= f;
}

const int N=1e5+5,mod=1e9+7;
__int128 n,m,a[N];
int ksm(int a,int b,int p)
{
	int res=1%p;
	while(b)
	{
		if(b&1)res=(LL)res*a%p;
		a=(LL)a*a%p;
		b>>=1;
	}
	return res;
}
int main()
{
    read(n),read(m);
    __int128 s=0,ss=0,sss=0;
    for(int i=1;i<=n;i++)
    {
    	read(a[i]);
    	s+=a[i];
    	ss=(ss+(LL)(n-i+1)*a[i]%mod)%mod;
    	sss=(sss+(LL)i*a[i]%mod)%mod;
    }
    int res[2];
    res[0]=((LL)ss*ksm(2,m,mod)%mod+(LL)ksm(2,m,mod)*(ksm(2,m,mod)-1)/2%mod*n%mod*s%mod)%mod;
    res[1]=((LL)ss*ksm(2,m-1,mod)%mod+(LL)sss*ksm(2,m-1,mod)%mod+(LL)ksm(2,m,mod)*(ksm(2,m,mod)-1)/2%mod*n%mod*s%mod)%mod;
    cout<<max(res[0],res[1]);
    return 0;
}

标签:Contest,int,Guilin,Site,long,times,define
From: https://www.cnblogs.com/zyyun/p/16847054.html

相关文章

  • [Leetcode Weekly Contest]317
    链接:LeetCode[Leetcode]2455.可被三整除的偶数的平均值给你一个由正整数组成的整数数组nums,返回其中可被3整除的所有偶数的平均值。注意:n个元素的平均值等于n个......
  • The 2021 ICPC Asia Shenyang Regional Contest
    The2021ICPCAsiaShenyangRegionalContest我们按难易程度来,E,F<B,J<H,I,L,ME.EdwardGaming,theChampion直接输出edgnb子字符串数量。F.EncodedStringsI分......
  • Team Extra Contest 2022-10-21补题
    D.38parrots线段树#include<bits/stdc++.h>usingnamespacestd;#defineIOSios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr)#definerep(a,b......
  • AtCoder Beginner Contest 275 D~F
    D-YetAnotherRecursiveFunction思路:直觉需要用到的数字大多数是重复的,所以记忆化了一下,测了一下1e18的数据,跑的飞快,直接交了,6ms。#include<bits/stdc++.h>#def......
  • AtCoder Beginner Contest 275 E F
    E-Sugoroku4题意:从0走到n,有k次操作,每次会丢出一个骰子,骰子上的数字为\([1,m]\),等概率出现问到达n的概率思路:\(dp[i][k]\)表示用了k次操作到达位置i的概......
  • Atcoder Beginner Contest 275(A~F)
    我好菜啊……又没切掉F,40+min切掉A~E成功滚粗。希望能越打越好吧……赛时A求序列最大值,B简单计算,C数正方形,跳过。D递推不太行,N的范围有点大。但是除法的转移......
  • AtCoder Beginner Contest 275
    咕咕咕咕咕咕。G-InfiniteKnapsack做法1-二分假设第\(i\)个物品选了\(x_i\)个,\(x_i\)为非负整数,有\[\lim_{x\to+\infin}\frac{f(x)}{x}=\frac{\sum_ic_......
  • AtCoder Regular Contest 060
    F题有循环节,一看就有KMP,比较难,太晚了,早上起来再补。C-TakandCards\(n\)个整数\(a_1\sima_n\),问有多少种选数方案,使得选出来的数平均值为\(A\)。\(1\len,a_i......
  • Weekly Contest 315
    WeeklyContest315ProblemALargestPositiveIntegerThatExistsWithItsNegative思路按照题目要求暴力求一下代码classSolution:deffindMaxK(self,num......
  • AtCoder Regular Contest 059
    EducationalDPRound(确信C-BeTogether给定\(n\)个数\(a_{1}\sima_n\),你至多可以对每个\(a_i\)操作一次,以\((a_i-y)^2\)的代价令\(a_i\getsy\),求\(a\)全......