[日常摸鱼]UVA11424&11426 GCD - Extreme

本文介绍了一种在UVa编程竞赛中高效解决特定GCD问题的方法,通过数学转换和预处理技巧,将问题转化为求和形式并利用约数特性优化计算,最终实现O(nlogn)的时间复杂度。
部署运行你感兴趣的模型镜像

话说UVa的机子跑的好快呀…

 

(两题题意一样,前一题数据范围比较小)

题意:求$\sum_{i=1}^{n-1} \sum_{j=i+1}^n gcd(i,j),n<4\times 10^6$

 


 

 

转换一下变成$\sum_{i=2}^{n} \sum_{j=1}^{i-1} gcd(i,j)$,这个形式我们可以设$f(n)=\sum_{i=1}^{n-1} gcd(i,n)$原答案$ans(n)=\sum_{i=2}^{n}f(i)$

考虑如何快速求$f(n)$,根据约数进行分类,对于$n$的一个约数$i$,容易发cai现dao出现的次数是$\phi(\frac{n}{i})$(后来才知道是因为$gcd(x,n)=i$等价于$gcd( \frac{x}{i}, \frac{n}{i})=1$,然后这样的$x$的个数就是$\phi(\frac{n}{i})$了)

经验告诉我们应该预处理出$f(n)$然后递推出所有答案,同样对于$f(n)$我们也得预处理,如果直接对于每个$n$求出约数来统计答案是不太可行的…然后就反过来枚举约数来不断更新$f(n)$

时间复杂度大概是$O(nlogn)$

 

#include<cstdio>
#include<cstring>
#include<algorithm>

const int N= 4000005;

typedef long long lint;

lint n,tot;
lint pri[N],phi[N],f[N],ans[N];
bool p[N];

inline void init()
{
    phi[1]=1;
    for(register int i=2;i<N;i++)
    {
        if(!p[i])
        {
            pri[++tot]=i;
            phi[i]=i-1;
        }
        for(register int j=1;j<=tot&&i*pri[j]<N;j++)
        {
            p[i*pri[j]]=1;
            if(i%pri[j]==0){phi[i*pri[j]]=phi[i]*pri[j];break;}
            else phi[i*pri[j]]=phi[i]*(pri[j]-1);
        }
    }
}

int main()
{
    init();
    
    for(register int i=1;i<N;i++)
        for(register int j=i*2;j<N;j+=i)f[j]+=i*phi[j/i];
    
    for(register int i=1;i<N;i++)ans[i]=ans[i-1]+f[i];
    
    while(scanf("%lld",&n)==1&&n)
        printf("%lld\n",ans[n]);
        
    return 0;
}
View Code

 

本地预处理跑了5s…然后交到UVa上居然快的飞起…

转载于:https://www.cnblogs.com/yoooshinow/p/7967366.html

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值