• 18清明校内测试T2


    一道数论好题(math)

    Time Limit:1000ms   Memory Limit:128MB

     

    题目描述

    rsy最近在研究欧几里得算法,不会的同学可以去看下课件以及代码……

    现在她想到了一个新的问题,求k个数的最大公约数!

    事实上这个问题仍然很简单。所以rsy想强化一下,她觉得最大公约数等于1就不是很有趣了。因此她想在n个数中找最多的数,使得它们的最大公约数不等于1。

    现在rsy想知道,能找最多多少个数。

     

    输入格式(math.in)

        第一行一个数n。

        第二行n个数ai。

     

    输出格式(math.out)

        一个数表示答案。

     

    输入样例

    5
    2 3 4 5 6
    

    输出样例

    3 
    

      

    数据范围

    对于30%的数据n<=5。

    对于50%的数据n<=20。

    对于80%的数据n<=1000,ai<=1000。

    对于100%的数据1<=n<=100000,1<=ai<=100000,数据几乎是随机的。


     我一开始做的时候想到了一些奇奇怪怪的想法,得了70,WA了一个,TLE了两个(莫名其妙)。

    正确打开方式应该是这样的:

    我们枚举从2到输入的数中最大的数作为所要选择的数的最大公约数。

    然后看看有几个数是这个数的倍数。

    到最后存下最大值就OK了。

    主要看这一行操作

    for(int j=i; j<=maxn; j+=i)
    

      

    万能的主啊,请看我的代码

    #include <iostream>
    #include <cstdio>
    
    using namespace std;
    
    int n, ans, maxn;
    int s[100008];
    int a[100008];
    
    int main() {
        scanf("%d", &n);
        for(int i=1; i<=n; i++) {
            scanf("%d", &s[i]);
            a[s[i]]++;
            maxn = max(maxn, s[i]);
        }
        for(int i=2; i<=maxn; i++) {
            int sum = 0;
            for(int j=i; j<=maxn; j+=i) {
                if(a[j]) {
                    sum += a[j];
                }
            }
            ans = max(sum, ans);
        }
        printf("%d", ans);
    }
  • 相关阅读:
    可持久化线段树区间查询 + 永久化标记 T^T online judge 2507
    可持久化线段树
    T^T online judge 3441
    食物链
    T^T ONLINE JUDGE 2592
    HDU 6312 GAME
    HDU 1430 魔板
    栈的操作链表+数组版
    Codeforces Round #468 (Div. 2, based on Technocup 2018 Final Round) D. Peculiar apple-tree
    Codeforces Round #468 (Div. 2, based on Technocup 2018 Final Round) C. Laboratory Work
  • 原文地址:https://www.cnblogs.com/bljfy/p/8735069.html
Copyright © 2020-2023  润新知