[數論]Podzielno
阿新 • • 發佈:2018-12-09
題目描述
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; }