蚂蚁笔试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;
    }
}```
全部评论
桶装起来计算根号和倍数也可以
点赞 回复 分享
发布于 03-09 20:47 沙特阿拉伯

相关推荐

头像
03-09 21:01
已编辑
华中科技大学 Java
1,模拟一下就好,别忘了处理换行和回车,代码略。2,bfs一下,找出每个点的坐标,o1输出就可以了。void&nbsp;bfs(int&nbsp;u)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;queue&nbsp;q;&nbsp;&nbsp;&nbsp;&nbsp;q.push(u);&nbsp;&nbsp;&nbsp;&nbsp;pos[u]&nbsp;=&nbsp;{0,&nbsp;0};&nbsp;&nbsp;&nbsp;&nbsp;mark[u]&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(q.size()&nbsp;&gt;&nbsp;0)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;v&nbsp;=&nbsp;q.front();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q.pop();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;l&nbsp;=&nbsp;-&nbsp;1,&nbsp;r&nbsp;=&nbsp;-1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(auto&nbsp;x&nbsp;:&nbsp;g[v])&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(mark[x])&nbsp;continue;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mark[x]&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q.push(x);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(l&nbsp;==&nbsp;-1)&nbsp;l&nbsp;=&nbsp;x;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r&nbsp;=&nbsp;x;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(l&nbsp;&gt;&nbsp;r)&nbsp;swap(l,&nbsp;r);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(l&nbsp;!=&nbsp;-1)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pos[l]&nbsp;=&nbsp;pair(pos[v].x&nbsp;-&nbsp;1,&nbsp;pos[v].y&nbsp;-&nbsp;1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(r&nbsp;!=&nbsp;-1)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pos[r]&nbsp;=&nbsp;pair(pos[v].x&nbsp;+&nbsp;1,&nbsp;pos[v].y&nbsp;-&nbsp;1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;}3,可以发现,我们要计算的是每个数整除其他数之后的和。其实可以反过来想,我们要计算每个数作为除数,其他数除他之后的和。对于数i来说,[j&nbsp;*&nbsp;i,&nbsp;j&nbsp;*&nbsp;i&nbsp;+&nbsp;i&nbsp;-&nbsp;1]这个范围内的数除以i等于j,那我们可以枚举每个i和每个j,维护一个前缀和来快速算出[j&nbsp;*&nbsp;i,&nbsp;j&nbsp;*&nbsp;i&nbsp;+&nbsp;i&nbsp;-&nbsp;1]这个范围内的贡献,贡献数是i的数量&nbsp;*&nbsp;范围内数的个数&nbsp;*&nbsp;j。时间复杂度是n&nbsp;+&nbsp;n/2&nbsp;+&nbsp;n&nbsp;/3&nbsp;+...&nbsp;=&nbsp;nlogn代码如下,cnt[i]是数字i的数量,sum[i]是前cnt[i]的前缀和,N是数的最大范围1e5;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;&nbsp;N;&nbsp;i&nbsp;++)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(cnt[i]&nbsp;==&nbsp;0)&nbsp;continue;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;j&nbsp;=&nbsp;1;&nbsp;j&nbsp;*&nbsp;i&nbsp;&lt;&nbsp;N;&nbsp;j&nbsp;++)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res&nbsp;+=&nbsp;1ll&nbsp;*&nbsp;(sum[min(i&nbsp;*&nbsp;j&nbsp;+&nbsp;i&nbsp;-&nbsp;1,&nbsp;N&nbsp;-&nbsp;1)]&nbsp;-&nbsp;sum[i&nbsp;*&nbsp;j&nbsp;-&nbsp;1])&nbsp;*&nbsp;cnt[i]&nbsp;*&nbsp;j;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;}#笔试# #蚂蚁# #蚂蚁笔试#
投递蚂蚁集团等公司10个岗位
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
正在热议
更多
牛客网
牛客企业服务