zoukankan      html  css  js  c++  java
  • Codeforces Round #520 (Div. 2) D. Fun with Integers

    D. Fun with Integers

    题目链接https://codeforc.es/contest/1062/problem/D

    题意:

    给定一个n,对于任意2<=|a|,|b|<=n,如果a->b,则存在一个x,使得x*a=b 或者 x*b=a,那么最终答案就是|x|的总和。相同的a,b不能被重复转化。

    题解:

    哎,这个复制过来格式各种错误,还是就这样吧...

    我们发现当a->b时,-a->b,-a->-b,a->-b中的x对答案的贡献都是一样的,所以我们就可以只考虑a,b>0且a<b的情况。

    对于2<=a<=n而言,b可以最多选(n/a-1)项,如果x=1可行的话,就是n/a项,最终对答案的贡献就是1+2+...+n/a。最后统计一下就可以了。

    可以优化一下复杂度变为根号n。

    代码如下:

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <iostream>
    using namespace std;
    
    typedef long long ll;
    const int N = 100005 ;
    int n;
    ll ans;
    
    int main(){
        scanf("%d",&n);
        for(int i=2;i<=n;i++){
            ll cnt = n/i;
            if(cnt<=1) break ;
            ans+=(cnt*(cnt+1)/2)-1;
        }
        printf("%lld",ans*4);
        return 0;
    }
  • 相关阅读:
    缓存清理
    机器学习在电商领域三大应用,推荐,搜索,广告中商品排序
    并发和并行
    拷贝控制
    gitk
    git GUI Clients
    new delete
    Windows 安装 gcc
    C++ 运算符优先级
    iostream 操作符
  • 原文地址:https://www.cnblogs.com/heyuhhh/p/9986423.html
Copyright © 2011-2022 走看看