2023 (ICPC) Jiangxi Provincial Contest -- Official Contest Gym - 104385B - Wonderful Array

题目链接:Problem - B - Codeforces

题目描述:

其实这道题吧, 就是一个序列,让你找出这个序列中有多少个数的,这肯定很多,因为b序列的当前值是由前一个值加上a序列里的一个值,故b序列整体呈递增的趋势,求<=的数据太多了,不好求。所以正难则反嘛,咱求>的个数,然后用总数n减去>的个数即可。

我们思考,满足前一个数取模大于后一个的情况是什么样的,应该是前一个数值接近m然后再加上一个a序列的值,由于a序列都对m取过模,故a序列中的数值必定小于m,相加后得到当前数值大于m,取模后的数值小于前一个数值。这就是我们要寻找的合法情况,对于每一个m都应该存在一个这样的数值,一共有几个m值呢?我们知道,b序列是递增的,故只要求出bn,让bn/m就可以得到全部 (bi mod m)>(bi+1 mod m)的情况,再让n-bn/m即为本题答案。

解题思路:

b序列本质上是a序列的前缀和加上一个常数,求bn=n/k个完整的a序列+x+剩下的a序列

代码如下:

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<math.h>
#define ll long long 
using namespace std;
const int N=1e6+10;
ll k,a[N],n,m,x,b[N],sum,ss;
int main()
{
	scanf("%lld",&k);
	for(int i=0;i<k;i++)
	{
		scanf("%lld",&a[i]);
	}
	scanf("%lld%lld%lld",&n,&m,&x);
	x%=m;
	for(int i=0;i<k;i++) 
	{
		a[i]%=m;
		ss+=a[i];
	}
	sum=ss*(n/k)+x;	
	int t=(n/k)*k;
	for(int i=0;i<n-t;i++)sum+=a[i];
	printf("%lld\n",n-sum/m);
	return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值