数学

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

相关推荐

02-10 12:23
已编辑
新余学院 C++
采集想要offer:专业技能那里要一条一条的列出来吧,感觉你项目很厉害了,但是如果你不写技术栈面试官对你项目不太懂的话都没办法问你八股😂C++都是基架岗,都是一群9✌🏻在卷,我觉得你要是有时间学个go把MySQL和redis写上去找个开发岗吧
点赞 评论 收藏
分享
秋招之BrianGriffin:你再跟他说华为工资也低(相对互联网)就可以享受私信爆炸了😋
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务