随笔 - 58,  文章 - 0,  评论 - 4,  阅读 - 3296

一、题目描述:

  T 组数据,每组数据给定 n,求i=1nlcm(i,n)

  数据范围:1T3×1051n1×106


 二、解题思路:

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

  dnd=φ(n)×n2

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

  证明一: gcd(i,n)=1, gcd(ni,n)=1

    gcd(ni,n)=k,k  1 

    ni=a1×k,n=a2×k,i=(a2a1)×k

     gcd(i,n)  k

  证明二:dnd=φ(n)×n2

    , gcd(i,n)=1, gcd(ni,n)=1

     ini (i,ni)  φ(n)  2, dnd  n=2×n2,

     i=ni (i,ni)  φ(n)  1, dnd  n2=1×n2,

    dnd=φ(n)×n2

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

    x=p1e1×p2e2×...×pnen

    φ(x)=n×i=1n(11pi)

    

     x, y,xy

    xxy

    yxy,φ(x)=φ(xy)×y

    yxy,φ(x)=φ(xy)×(y1)

  现在这个题就做完了,时间复杂度 O(n+Tn)


 三、完整代码:

复制代码
 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线 φ() =>Exp++!

  2 φ() =>Exp++!

posted on   trh0630  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示