题目大意:给定B和一些数字,第i(0≤i<B)个数有ai个,要求用这些数字构造一个B进制数,数字可以不全用,要求这个数是B−1的倍数且最大
逗比题……
定理:一个数是B−1的倍数当且仅当其在B进制下所有位之和为B−1的倍数
原理是a∗Bk≡a(mod B−1)
然后如果它给的所有位之和mod B−1不等于0,显然我们要删位,显然删的位越少越好,那么到底删多少呢?
观察到ai≥1,所以删一位就行了【捂脸】
然后输出的话就前缀和二分一下就行了
时间复杂度O(n+qlogn)
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 1001001
using namespace std;
int n,q;
long long a[M];
int main()
{
long long sum=0;
cin>>n>>q;
for(int x,i=0;i<n;i++)
{
scanf("%lld",&a[i]);
(sum+=a[i]*i)%=n-1;
}
if(sum)
a[sum]--;
for(int i=1;i<n;i++)
a[i]+=a[i-1];
long long temp=0;
for(int i=1;i<=q;i++)
{
scanf("%lld",&temp);
int ans=upper_bound(a,a+n,temp)-a;
if(ans==n) ans=-1;
printf("%d\n",ans);
}
return 0;
}