蚂蚁笔试0309第三题
#牛客AI配图神器##牛客创作赏金赛##牛客创作赏金赛##ai智能作图#
```java
import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
/**
只要大的除小的就可以了
*/
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[]a = new int[n];
for (int i = 0; i < n; i++)a[i] = in.nextInt();
Arrays.sort(a);
long s = 0;
for (int i = 0; i < n; i++) { //枚举起点
int p = 1;
int st = a[i];
int l = i - 1, r = 0;
while (st * p <= a[n - 1]) { //寻找i的每个倍数的最近处
int tar = st * p;
r = find(a, tar); //二分查找 p倍的最小处
s += (r - l) * (p - 1);
l = r;
p++;
}
s += (n - l) * (p-1);//末尾计算
}
System.out.println(s);
}
public static int find(int[]a, int t) { //找到大于等于t的最小位置
int l = 0, r = a.length - 1;
while (l < r) {
int mid = (l + r) >> 1;
if (a[mid] < t)l = mid + 1;
else r = mid;
}
return r;
}
}```
```java
import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
/**
只要大的除小的就可以了
*/
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[]a = new int[n];
for (int i = 0; i < n; i++)a[i] = in.nextInt();
Arrays.sort(a);
long s = 0;
for (int i = 0; i < n; i++) { //枚举起点
int p = 1;
int st = a[i];
int l = i - 1, r = 0;
while (st * p <= a[n - 1]) { //寻找i的每个倍数的最近处
int tar = st * p;
r = find(a, tar); //二分查找 p倍的最小处
s += (r - l) * (p - 1);
l = r;
p++;
}
s += (n - l) * (p-1);//末尾计算
}
System.out.println(s);
}
public static int find(int[]a, int t) { //找到大于等于t的最小位置
int l = 0, r = a.length - 1;
while (l < r) {
int mid = (l + r) >> 1;
if (a[mid] < t)l = mid + 1;
else r = mid;
}
return r;
}
}```
全部评论
桶装起来计算根号和倍数也可以
相关推荐
点赞 评论 收藏
分享
02-24 20:17
武汉大学 前端工程师 点赞 评论 收藏
分享
02-04 21:03
兰州财经大学 新媒体运营 求求要我吧:你教育经历放在下面干什么,而且27届还是28届啊()另外看你简历有两面,通常来说投递运营岗位一面简历就够了。另外个人总结要写也放在简历最下面,然后你奖项那里是2019年的哇哈哈,那你究竟投递的是社招还是实习?实习的话你是第几届是肯定要写出来的,社招的话你这个工作经历又太短太花了
点赞 评论 收藏
分享
莉莉丝游戏公司福利 775人发布