1. 程式人生 > >[數論]Podzielno

[數論]Podzielno

題目描述

B進位制數,每個數字i(i=0,1,...,B-1)有a[i]個。你要用這些數字組成一個最大的B進位制數X(不能有前導零,不需要用完所有數字),使得X是B-1的倍數。q次詢問,每次詢問X在B進位制下的第k位數字是什麼(最低位是第0位)。

 

輸入

第一行包含兩個正整數B(2<=B<=10^6),q(1<=q<=10^5)。
第二行包含B個正整數a[0],a[1],a[2],...,a[B-1](1<=a[i]<=10^6)。
接下來q行,每行一個整數k(0<=k<=10^18),表示一個詢問。

 

輸出

輸出q行,每行一個整數,依次回答每個詢問,如果那一位不存在,請輸出-1。

 

樣例輸入

3 3
1 1 1
0
1
2

樣例輸出

0
2
-1

思路:結論:一個數能被B-1整除的充要條件是該數在B進位制下的各個位值之和能被B-1整除
AC程式碼:
#include <iostream>
#include<cstdio>
typedef long long ll;
using namespace std;

ll a[1000005],s[1000005];

int main()
{
    ll B,q;scanf("%lld%lld",&B,&q);
    ll sum=0;
    for(ll i=0
;i<=B-1;i++) {scanf("%lld",&a[i]);sum+=i*a[i];} if(sum%(B-1)!=0) {a[sum%(B-1)]--;sum--;} s[0]=a[0]; for(ll i=1;i<=B-1;i++) s[i]=s[i-1]+a[i]; while(q--){ ll k;scanf("%lld",&k);k++; ll pos=lower_bound(s,s+B,k)-s; if(pos==B) printf("-1\n");
else printf("%lld\n",pos); } return 0; }