10297: Podzielno
阿新 • • 發佈:2018-12-25
題目描述
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。
運用定理:
a*B^k≡a (mod (B-1) )
那麼本題只需要減去(a*B^k)mod(B-1):
sum=(sum+i*a[i]%(B-1))%(B-1); 然後去掉一個a[sum] 即可
再利用二分查詢答案
#include <cstdio> #include <cstring> #include<iostream> #define ll long long const int N=1000005; using namespace std; ll a[N]; int main() { int B,q,sum=0; cin>>B>>q; for(ll i=0;i<B;i++) { cin>>a[i]; sum=(sum+i*a[i]%(B-1))%(B-1); } if (sum) a[sum]--; for(int i=1;i<B;i++) a[i]+=a[i-1]; while(q--) { ll num; cin>>num; ll x=num+1; ll lo=0,hi=B-1; while(lo<=hi) { ll mid=(lo+hi)/2; if (a[mid]<x) lo=mid+1; else hi=mid-1; } if (hi==B-1) cout<<-1<<endl; else cout<<hi+1<<endl; } return 0; }