题目描述:
其实这道题吧, 就是一个序列,让你找出这个序列中有多少个数的,这肯定很多,因为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;
}