题目大意:给定
B
和一些数字,第
逗比题……
定理:一个数是
B−1
的倍数当且仅当其在
B
进制下所有位之和为
原理是 a∗Bk≡a(mod B−1)
然后如果它给的所有位之和
mod B−1
不等于
0
,显然我们要删位,显然删的位越少越好,那么到底删多少呢?
观察到
然后输出的话就前缀和二分一下就行了
时间复杂度 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;
}