Mod
Time Limit: 1000 MS Memory Limit: 100000 KTotal Submit: 1929 (435 users) Total Accepted: 138 (134 users) Special Judge: No
Description
Kim刚刚学会C语言中的取模运算(mod)。他想要研究一下一个数字A模上一系列数后的结果是多少。帮他写个程序验证一下。
Input
第一行一个整数T代表数据组数。
接下来T组数据,第一行一个整数n,接下来n个数字ai
接下来一行一个整数m,接下来m个数字bi。
Output
对于每个bi,输出bi%a1%a2%...%an 。
Sample Input
1
4
10 9 5 7
5
14 8 27 11 25
Sample Output
4
3
2
1
0
Hint
在C语言中,A mod B 是 a%b
样例解释:
14%10%9%5%7=4
8%10%9%5%7=3
...
数据范围:
1<=n<=100000
1<=m<=100000
1<=ai<=1000000000
0<=bi<=1000000000
题解:这道题可以用二分查找,只要找到比被除数小的就可以了。
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <iostream>
#define left lll
#define right rrr
#define FOR(i,j,k) for(int i=j;i<=k;i++)
using namespace std;
typedef long long LL;
int a[200000+233];
int n,m;
LL last,left,right,mid,q;
int main (int argc, char *argv[])
{
int noc;scanf("%d",&noc);
while (noc--)
{
int n;scanf("%d",&n);
FOR(i,1,n) scanf("%d",&a[i]);
last=1;
FOR(i,2,n){
if (a[i]<a[last]){
last++;
a[last]=a[i];
}
}
n=last;
scanf("%d",&m);
FOR(i,1,m){
scanf("%lld",&q);
while (1){
left=0;
right=n+1;
while (right-left>1){
mid=(right+left)/2;
if (a[mid]<=q){
right=mid;
}else left=mid;
}
if (right==n+1) break;
q=q%a[right];
}
printf("%lld\n",q);
}
}
return 0;
}