首页 > 其他分享 >P1891 疯狂 LCM 题解

P1891 疯狂 LCM 题解

时间:2023-07-14 17:12:52浏览次数:43  
标签:frac gcd 题解 sum P1891 mid varphi times LCM

一、题目描述:

  $T$ 组数据,每组数据给定 $n$,求$\sum_{i=1}^{n}lcm(i,n)$

  数据范围:$1\le T \le 3\times 10^5,1\le n\le 1\times 10^6$ 。


 二、解题思路:

  个人觉得思维难度不大,只是要记住一个结论:

  $\sum_{d\mid n}d=\frac{\varphi(n)\times n}{2}$

  这个公式对于 $1$ 以外的正整数都成立。

  证明一:$若\ gcd(i,n)=1,则\ gcd(n-i,n)=1$

    $反证:假设gcd(n-i,n)=k,k\ 为大于\ 1\ 的正整数$

    $则n-i=a_1\times k , n=a_2 \times k , i=(a_2-a_1)\times k$

    $所以\ gcd(i,n)\ 至少为\ k,矛盾,命题得证$

  证明二:$\sum_{d\mid n}d=\frac{\varphi(n)\times n}{2}$

    $由证明一得,若\ gcd(i,n)=1,则\ gcd(n-i,n)=1$

    $当\ i\ne n-i\ 时,(i,n-i)\ 对\ \varphi(n)\ 的贡献为\ 2,对\ \sum_{d\mid n}d\ 的贡献为\ n=2\times \frac{n}{2},成立。$

    $当\ i=n-i\ 时,(i,n-i)\ 对\ \varphi(n)\ 的贡献为\ 1,对\ \sum_{d\mid n}d\ 的贡献为\ \frac{n}{2}=1\times \frac{n}{2},成立。$

    $综上,\sum_{d\mid n}d=\frac{\varphi(n)\times n}{2},命题得证。$

  那这个题就不难了,推一下式子就行了,顺便证一下线性筛 $\varphi()$ 函数。

    $已知若x=p_1^{e_1}\times p_2^{e_2}\times ...\times p_n^{e_n}$

    $则\varphi(x)=n\times \prod_{i=1}^{n}(1-\frac{1}{p_i})$

    $欧拉筛中,每个合数会被自己最小的质因子筛掉$

    $设当前的数为\ x,最小质因子为\ y,另一个因数为\frac{x}{y}$

    $首先,x 必然有所有 \frac{x}{y} 的质因子$

    $当y\mid \frac{x}{y} ,\varphi(x)=\varphi(\frac{x}{y})\times y$

    $当y\nmid \frac{x}{y},\varphi(x)=\varphi(\frac{x}{y})\times(y-1)$

  现在这个题就做完了,时间复杂度 $O(n+T\sqrt{n})$。


 三、完整代码:

 1 #include<iostream>
 2 #define N 1000010
 3 #define lim 1000000
 4 using namespace std;
 5 int T,n,cnt;
 6 long long ans,f[N];
 7 int p[N],vis[N],phi[N];
 8 void pre_work()
 9 {
10     phi[1]=f[1]=1;
11     for(int i=2;i<=lim;i++)
12     {
13         if(!vis[i]) p[++cnt]=i,phi[i]=i-1;
14         for(int j=1;j<=cnt&&p[j]*i<=lim;j++)
15         {
16             vis[i*p[j]]=1;
17             if(i%p[j]==0){
18                 phi[i*p[j]]=phi[i]*p[j];
19                 break;
20             }else    phi[i*p[j]]=phi[i]*phi[p[j]];
21         }
22     }
23     for(int i=2;i<=lim;i++)
24         f[i]=1ll*i*phi[i]/2;
25 }
26 void solve()
27 {
28     cin>>n;ans=0;
29     for(int i=1;i*i<=n;i++)
30         if(n%i==0)
31         {
32             ans+=f[i];
33             if(i*i!=n) ans+=f[n/i];
34         }
35     cout<<ans*n<<'\n';
36 }
37 int main()
38 {
39     ios::sync_with_stdio(false);
40     cin.tie(0);cout.tie(0);
41     cin>>T;pre_work();
42     for(int i=1;i<=T;i++)
43         solve();
44     return 0;
45 }

四、写题心得:

  写数学题就是推公式比较耗时间,但是有一种其他题都享受不到的快感!收获经验如下:

  $1、线性筛\ \varphi()\ 函数的方法。=> Exp++!$

  $2、关于\ \varphi()\ 函数的一个公式。=> Exp++!$

标签:frac,gcd,题解,sum,P1891,mid,varphi,times,LCM
From: https://www.cnblogs.com/yhy-trh/p/P3911.html

相关文章

  • VMware17无法连接USB设备的问题解决方案
    前言【前言都是废话,可以直接看解决方案】事情是这样的,最近在做IMX6ULL的开发,刚开始就遇到了这个拦路虎问题,我使用的闪迪的TF卡32GB的,搭配绿联的读卡器使用。在windows以及物理机装的archlinux都能正常识别并进行挂载,离谱的就是在虚拟机上识别不了。虚拟机版本:VMwareWorkstati......
  • CF1220F Gardener Alex 题解--zhengjun
    发现根节点一定是\(1\),所以考虑两边的子树深度,然后发现只需要考虑一段后缀或前缀的深度即可。所以循环位移后,可以从中间往两边构建笛卡尔树,实时维护深度即可。代码#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;constintN=2e5+10;intn,a[N],ans[N];......
  • CF732E Sockets 题解
    功率是\(x\)的插座插入一个适配器后功率是\(y\),功率是\(y\)的插座插入一个适配器后功率是\(z\),那么相当于功率是\(x\)的插座插入两个适配器。一个电脑可以用功率小的插座插入较少的适配器表达,也可以用功率大的插座插入较多的适配器表达。这里功率大的插座必然能表达出功......
  • 题解 [NOIP2015 提高组] 运输计划
    题目链接闲话:虽说是紫题,但慢慢想还是完全没有问题的。由于\(m\)个运输计划同时开始,所以耗费时间就是最慢的飞船耗费的时间(即最长时间)。考虑到题目让求最短时间,也就是最长的最短,可以二分。考虑二分最长时间(记作\(k\)),那么将所有路径分成两类,一类是原来耗费的时间就小于等于\(......
  • QOJ 6504. CCPC Final 2022 D Flower's Land 2题解
    QOJ6504.CCPCFinal2022DFlower'sLand2题解题意简述给你一个只含\(0,1,2\)的序列,相邻两个相同的数字可以直接消掉。询问包含两种区间所有数\(+1\)并对\(3\)取模。求一段区间能否用上述消除方式消完。样例输入8901211012245236168168236......
  • yarn : 无法加载文件 E:\nodejs\yarn.ps1,因为在此系统上禁止运行脚本。问题解决
    1.在电脑的开始菜单中,搜索PowerShell ,然后以管理员身份运行,如下所示:2.以管理员身份运行后,会出现命令窗口,接下来,输入命令get-ExecutionPolicy 查看权限,会看到它的返回值是 Restricted ,意思是当前是禁用的。3.执行命令:set-ExecutionPolicyRemoteSigned,没有报错就......
  • CF1846D Rudolph and Christmas Tree 题解
    Decription一颗圣诞树由\(n\)个底边为\(d\),高度为\(h\)的等腰三角形组成,每个三角形以\(y\)轴为对称轴,底边均平行于\(x\)轴,三角形有可能重叠。给出\(n,d,h\)以及每个三角形底边与\(x\)轴的距离,求该圣诞树的面积。Solution如图,这是一棵圣诞树,其由两部分组成,完整......
  • NOI2021 题解
    [NOI2021]轻重边转化一下题意:每次给一条链染色,查一条链从\(x\)到\(y\)有几条边两端颜色相同。那这个随便树剖线段树就好了。也可以LCT,码量可能要小点。#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<vector>usingnamespace......
  • 题解 最大加权矩阵
    题目链接虽然是一道橙题,但还是蕴含了重要算法思想——降维思想。如果是一维形式,即最大子段和,我们采取先求前缀和,并固定右端点,减去左边最小的办法求。对于这题,若固定了上下边界,则可以利用列的前缀和将其“压缩”为一维形式,再采取“最大子段和”的方式求解。如下面一个二维矩阵:......
  • 题解 醋溜便当
    题目链接题目让我们找出每个点是否存在长度\(\in[x,k\timesx]\)的回路,若找到一长度为\(a(0<a\lex)\)的回路,那么必然存在\(pa\in[x,k\timesx](p\in\Z)\),若找到长度\(\in[x,k\timesx]\)的回路,直接符合条件。所以问题转化为求是否存在\(\in[1,k\timesx]\)的回路,只需......