数学

wnm喜欢的数学题

https://ac.nowcoder.com/acm/contest/2710/J


wnm喜欢的数学题


解题思路比较明确,也没啥难的,除了一个比较弱的考点,两数最小公倍数等于两数乘积除以最大公约数。
一个数等于两个数乘积一定能被小于等于图片说明的数整除,比如9被1整除(1,9)9被3整除(3,3)平方根3只能算一个因子,所以因子个数就更少了,所以我们直接把全部的因子保存起来,再通过二重循环遍历每一对组合,判断是否满足题目条件。如果满足,答案数加1。
可想而知当初我是多么的弱……这种题目都没时间看……很多时候题目不写一定不对,有了思路就是时间复杂度可能过大,也要去尝试,再去想想优化或者改进思路。


cpp代码搓我还用了GNU的内置函数__gcd以及STL容器vector以及auto关键字

#include <stdio.h>

typedef long long ll;
const int N = 1e3 + 7;
ll num[N]; //保存全部的因子
int cnt; //记录因子个数

ll gcd(ll a, ll b) { //辗转相除法求最大公约数
    while (b) {
        ll tmp = a % b;
        a = b;
        b = tmp;
    }
    return a;
}

int main() {
    ll n;
    scanf("%lld", &n);
    //把全部的因子放在num数组中
    for (ll i = 1; i * i <= n; ++i) {
        if (n % i == 0)
            if (i == n / i)    num[cnt++] = i; //完全平方数只算一次
            else {
                num[cnt++] = i;
                num[cnt++] = n / i;
            }
    }
    int ans = 0;
    for (int i = 0; i < cnt; ++i)
        for (int j = 0; j < cnt; ++j)
            //  最大公约数=两数乘积除以最大公约数
            if (num[i] / gcd(num[i], num[j]) * num[j] == n)
                ++ans;
    printf("%d\n", ans);
    return 0;
}

全部评论
纠结了好久,这样还真能过??orz
点赞 回复 分享
发布于 2020-04-25 11:15

相关推荐

07-29 14:09
门头沟学院 Java
我爱o泡我爱o泡o泡果奶ooo
26加瓦鼠鼠:三个offer了,停手吧,回头是岸
点赞 评论 收藏
分享
07-25 10:17
仰恩大学 营销
bg双非,被挂了
投递拼多多集团-PDD等公司10个岗位
点赞 评论 收藏
分享
程序员小白条:学历GG,这个排版布局,还有行间距和字缩进不大行,女生自我要求应该更高才是,没内容,起码美观这块要做好
投了多少份简历才上岸
点赞 评论 收藏
分享
零OFFER战士:另一个版本查看图片
点赞 评论 收藏
分享
不多说了,看图吧
MomonKa:实际上是,机房机器有些高度,问问你身高,有没有女朋友是看你能不能猛猛加班
你最讨厌面试问你什么?
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务