绍兴网站建设冯炳良,互联网营销,网站a记录的是做cname,wordpress 相关文章正题
题目链接:https://www.luogu.com.cn/problem/P5956 题目大意 BBB进制下#xff0c;给出序列aaa#xff0c;aia_iai表示数字iii有多少个。求一个最大的XXX在BBB进制下#xff0c;由给出的数字组成#xff08;不一定要用完#xff09;#xff0c;且其是B−1B-1B−1…正题
题目链接:https://www.luogu.com.cn/problem/P5956 题目大意
BBB进制下给出序列aaaaia_iai表示数字iii有多少个。求一个最大的XXX在BBB进制下由给出的数字组成不一定要用完且其是B−1B-1B−1的倍数。
qqq次询问XXX的第kkk位是几。
2≤B≤106,1≤q≤105,1≤ai≤106,0≤k≤10182\leq B\leq 10^6,1\leq q\leq 10^5,1\leq a_i\leq 10^6,0\leq k\leq 10^{18}2≤B≤106,1≤q≤105,1≤ai≤106,0≤k≤1018 解题思路
设xix_ixi表示第iii位的话就是 (∑i0xi×Bi)%(B−1)0⇒∑i0(xi×Bi%(B−1))0\left(\sum_{i0}x_i\times B^i\right)\%(B-1)0\Rightarrow \sum_{i0}\left(x_i\times B^i\%(B-1)\right)0(i0∑xi×Bi)%(B−1)0⇒i0∑(xi×Bi%(B−1))0 拆开单独的一个来看 xi×Bi%(B−1)(xi%(B−1))×(Bi%(B−1))x_i\times B^i\%(B-1)(\ x_i\%(B-1)\ )\times (\ B^i\%(B-1)\ )xi×Bi%(B−1)( xi%(B−1) )×( Bi%(B−1) ) xi%(B−1)×1x_i\%(B-1)\times 1xi%(B−1)×1
所以其实就是各位数字的和为B−1B-1B−1的倍数就好了。
然后再回头看题目发现有限制ai≥1a_i\geq 1ai≥1。这样如果用上所有数字的和对B−1B-1B−1取模为ttt的话若ttt不为000我们就让ata_tat减去一个111就好了。
然后对于询问求一个前缀和然后二分
时间复杂度O(BqlogB)O(Bq\log B)O(BqlogB) code
#includecstdio
#includecstring
#includealgorithm
#define ll long long
using namespace std;
const ll N1e610;
ll B,q,a[N];
signed main()
{scanf(%lld%lld,B,q);ll t0;for(ll i0;iB;i){scanf(%lld,a[i]);(ta[i]*i)%B-1;}if(t)a[t]--;for(ll i0;iB;i)a[i]a[i-1];while(q--){ll x;scanf(%lld,x);x;if(xa[B-1])puts(-1);else printf(%lld\n,lower_bound(a,aB,x)-a);}return 0;
}