1. 程式人生 > >第十五屆浙江省賽 F Now Loading!!!

第十五屆浙江省賽 F Now Loading!!!

multipl pla ike svg nbsp span bits () 二分

Now Loading!!!

Time Limit: 1 Second Memory Limit: 131072 KB

DreamGrid has integers . DreamGrid also has queries, and each time he would like to know the value of

for a given number , where , .

Input

There are multiple test cases. The first line of input is an integer indicating the number of test cases. For each test case:

The first line contains two integers and () -- the number of integers and the number of queries.

The second line contains integers ().

The third line contains integers ().

It is guaranteed that neither the sum of all nor the sum of all exceeds .

Output

For each test case, output an integer , where is the answer for the -th query.

Sample Input

2
3 2
100 1000 10000
100 10
4 5
2323 223 12312 3
1232 324 2 3 5

Sample Output

11366
45619

題解:  
對於a^n+1與a^(n+1),以a為底取log向上取整後是一樣的。  
因此可以按區間計算,然後二分查找區間。  
註意:先除在求和與先求和在除是不一樣的,賽場上沒想到  
這一點導致這題沒過。  
代碼:  
#include<bits/stdc++.h>  
using namespace std;  
#define ll long long  
const int maxn=500005
; const int mod=1e9; ll a[maxn]; int b[maxn][33]; int main() { int T;scanf("%d",&T); while(T--) { int n,m;scanf("%d%d",&n,&m); ll ma=0,ans=0; for(int i=1;i<=n;i++) { scanf("%lld",&a[i]); ma=max(ma,a[i]); } sort(a+1,a+n+1); for(ll i=1;i<33;i++) { for(int j=1;j<=n;j++) b[j][i]=(b[j-1][i]+a[j]/i)%mod; } for(int i=1;i<=m;i++) { ll x;scanf("%lld",&x); bool bb=0;ll sum=0; int a1=1; for(ll j=1,k=1;;k++) { if(j<=ma)j=j*x; else break; int id=upper_bound(a+a1,a+n+1,j)-a-1; sum=(sum+b[id][k]-b[a1-1][k])%mod; if(sum<0)sum+=mod; a1=id+1; } ans=(ans+i*sum)%mod; } printf("%lld\n",ans); } return 0; }

第十五屆浙江省賽 F Now Loading!!!