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 注意到不断取模下去会越来越小,而且一个数模a之后再模b,如果a比b小那么模b就没有意义了。所以对输入的a数组剔除所有没用的数,剩下一个递减的数组。在这个数组上,每次二分找到距离当前x最接近且大于x的数,模上这个数重复这一过程即可。这个过程不会重复很多次。很快这个数就会小于所有的a,这时就获得了答案。 #include<iostream>#include<cstdio> using namespace std; int main() { int t,m,n; int i,j,left,right,mid; long long a[100005]; long long ai,bi; scanf("%d",&t); while(t--) { scanf("%d",&n); j=0; for(i=0;i<n;i++) { scanf("%lld",&ai); if(i==0) { a[j++]=ai; } else { if(ai<a[j-1]) a[j++]=ai; } } scanf("%d",&m); while(m--) { scanf("%lld",&bi); while(1) { left=0; right=j-1; while(left<right) { mid=(right+left)/2; if(a[mid]<=bi) right=mid; else left=mid+1; } bi=bi%a[right]; if(bi<a[j-1])//比最小的数都小的话,就找完了 break; } printf("%lld\n",bi); } } } |
哈理工oj618 Mod(二分查找)
最新推荐文章于 2019-08-27 20:24:00 发布