uvaoj 11426 - GCD - Extreme (II)

题解:
1.g(n,i)(i < n)含义是小于n的数中与n最大公约数为i的数量
2.g(n,i) = phi(n / i)
总结:
1.这道题目也没有自己做出来,貌似最近好多问题都没有自己做出来了,跟最近学习方法也有一些关系吧
2.这道题,解题的关键之处我认为在于找到g(n,i)这个表达式,那么如何才能想到呢
3.嗯,如果按照题目的思路就是:gcd(n,m) = i,枚举n,m但是复杂度太高 -> 但是如果我们枚举n和i呢。
4.感觉很多时候躺在床上想题,还是会有一些遗漏,想问题还是要先写在纸上,然后把所有已知条件列出来,然后找到一些可能求解的方法,如果实在想不出来了,陷入死胡同了,往往休息一下,躺在床上,也许能够跳出循环,想到解题方法。
5.时间安排!一定要分片处理,没科目学一小时,然后休息会,休息的时候最好溜达会,然后学会英语。这样效率才能提高!时间分片

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define MAXN 4000010
int phi[MAXN];
void phi_table()
{
    phi[1] = 1;
    for(int i = 2;i < MAXN;i++)if(!phi[i])
    {
        phi[i] = i - 1;
        for(int j = i * 2;j < MAXN;j += i)
        {
            if(!phi[j])phi[j] = j;
            phi[j] = phi[j] / i * (i - 1);
        }
    }
}
int main()
{
    phi_table();
    int n;
    while(cin >> n && n)
    {
        long long ans = 0;
        for(long long i = 2;i <= n;i++)
        {
            long long cur = n / i;
            ans += phi[i] * ((1 + cur) * cur / 2);
        }
        cout << ans << endl;
    }
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值