GCD - Extreme (II)(UVA11426)

本文介绍了一种使用欧拉函数结合等差数列公式解决特定数学问题的方法,并提供了一个C++实现示例。通过筛选素数并应用欧拉函数更新数值,最后利用等差数列公式计算总和。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路:欧拉函数;

欧拉函数,然后用下等差数列公式就行了。

 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<queue>
 5 #include<math.h>
 6 #include<vector>
 7 #include<bitset>
 8 using namespace std;
 9 typedef long long LL;
10 bool prime[5000000];
11 int ans[1000000];
12 int oula[5000000];
13 int main(void)
14 {
15     int i,j;
16     for(i = 0; i < 5000000; i++)
17     {
18         oula[i] = i;
19     }
20     for(i = 2; i <10000 ; i++)
21     {
22         if(!prime[i])
23         {
24             for(j = i; (i*j) <= 5000000; j++)
25                 prime[i*j] = true;
26         }
27     }
28     int cn = 0;
29     for(i = 2 ; i <= 5000000; i++)
30         if(!prime[i])
31             ans[cn++]=i;
32     oula[0] = 0;
33     oula[1] = 1;
34     for(i = 0; i < cn; i++)
35     {
36         for(j = 1; (ans[i]*j) <= 5000000; j++)
37         {
38             oula[ans[i]*j]/=ans[i];
39             oula[ans[i]*j]*=ans[i]-1;
40         }
41     }
42     int n;
43     while(scanf("%d",&n),n!=0)
44     {   LL sum=0;
45         for(i = 2;i <=n ;i++)
46         { LL ak = (LL)(1+n/i)*(LL)(n/i)/2;
47           sum+=ak*oula[i];
48         }
49         printf("%lld\n",sum);
50     }return 0;
51 }

 

转载于:https://www.cnblogs.com/zzuli2sjy/p/5797705.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值