51Nod 1237 最大公约数之和 V3 杜教筛

题目链接http://www.51nod.com/Challenge/Problem.html#!#problemId=1237

题意:求$\sum_{i=1}^{n}\sum_{j=1}^{n}gcd(i,j)$ ,$1\leq{n}\leq10^{10}$.

知识提要:$n=\sum_{d|n}\varphi(d)$ 该公式证明https://blog.csdn.net/chen1352/article/details/50695930

根据莫比乌斯反演可以得到 $\varphi(n)=\sum_{d|n}\mu(\frac{n}{d})d$

解析:试着化简这个柿子,枚举最大公因数d

$$ \quad\sum_{d=1}^{n}\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{n}{d}\rfloor}[(i,j)=1]d\\$$

$$=\sum_{d=1}^{n}d\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{n}{d}\rfloor}[(i,j)=1]$$

右边根据莫比乌斯反演化简

$$\sum_{d=1}^{n}d\sum_{d‘=1}^{\lfloor\frac{n}{d}\rfloor}\mu(d‘)\lfloor{\frac{n}{dd‘}}\rfloor\lfloor{\frac{n}{dd‘}}\rfloor$$

令T=dd‘

$$\sum_{T=1}^{n}\lfloor{\frac{n}{T}}\rfloor\lfloor{\frac{n}{T}}\rfloor\sum_{d|T}\mu(\frac{T}{d})d$$

把右边替换成$\varphi(T)$得到

$$\sum_{T=1}^{n}\lfloor{\frac{n}{T}}\rfloor\lfloor{\frac{n}{T}}\rfloor\varphi(T)$$

所以求出来欧拉函数的前缀和 这个式子也就求出来了

AC代码

#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define all(a) (a).begin(), (a).end()
#define fillchar(a, x) memset(a, x, sizeof(a))
#define huan printf("\n");
#define debug(a,b) cout<<a<<" "<<b<<" ";
using namespace std;
const int maxn=1e6+10,inf=0x3f3f3f3f;
typedef long long ll;
const ll mod = 1000000007;
typedef pair<int,int> pii;
int check[maxn],prime[maxn],phi[maxn],sum[maxn];
void Phi(int N)//莫比乌斯函数线性筛
{
    int pos=0;sum[0]=0;
    sum[1]=phi[1]=1;
    for(int i = 2 ; i <= N ; i++)
    {
        if (!check[i])
            prime[pos++] = i,phi[i]=i-1;
        for (int j = 0 ; j < pos && i*prime[j] <= N ; j++)
        {
            check[i*prime[j]] = 1;
            if (i % prime[j] == 0)
            {
                phi[i*prime[j]]=phi[i]*prime[j];
                break;
            }
            else
                phi[i*prime[j]]=phi[i]*(prime[j]-1);
        }
        sum[i]=(sum[i-1]+phi[i])%mod;
    }
}
unordered_map<ll,ll> ma;
ll inv2=500000004;
ll solve(ll n)
{
    if(n<=1e6)
        return sum[n];
    else if(ma.count(n))
        return ma[n];
    ll temp = ((n%mod)*((n+1)%mod)%mod)*inv2%mod;
    for(ll i=2,j;i<=n;i=j+1)
    {
        j=n/(n/i);
        temp = (temp-solve(n/i)*(j-i+1)%mod+mod)%mod;
    }
    return ma[n]=temp;
}
int main()
{
    ll n;
    Phi(1e6);
    scanf("%lld",&n);
    ll ans=0;
    for(ll i=1,j;i<=n;i=j+1)
    {
        j=n/(n/i);
        ll k=(n/i)%mod;
        k = k*k%mod;
        ll temp=((solve(j)-solve(i-1)+mod)%mod)*k%mod;
        ans=(ans+temp)%mod;
    }
    printf("%lld\n",ans);
}

原文地址:https://www.cnblogs.com/stranger-/p/10762784.html

时间: 2024-10-28 23:27:14

51Nod 1237 最大公约数之和 V3 杜教筛的相关文章

51NOD 1237 最大公约数之和 V3(杜教筛)

题意 求 $\sum_{i=1}^n \sum_{j=1}^n gcd(i,j)$. 分析 $$\begin{aligned}\sum_{i=1}^n \sum_{j=1}^n gcd(i,j)  &= \sum_{i=1}^n \sum_{j=1}^n d[gcd(i, j)=d] \\&= \sum_{d=1}^n d \sum_{i=1}^n \sum_{j=1}^n[gcd(i,j=d)] \\&= \sum_{d=1}^n d \sum_{i=1}^{\left \lfl

51nod 1220 约数之和(杜教筛 + 推推推推推公式)

题意 给出\(n(1\leq n \leq 10^9)\),求\(\sum_{i=1}^n\sum_{j=1}^n\sigma(ij)\),其中\(\sigma(n)\)表示\(n\)的约数之和. balabala 交了两道杜教筛的的板子题(51nod 1239, 1244)就看到了这题,然后不会搞,然后看题解看了一天一夜终于彻底搞明白一发A掉了...感觉学到了很多,写个博客整理一下,如有错请指出. 技能需求 数论函数与线性筛 莫比乌斯反演(也可以当成容斥去理解) 狄利克雷卷积 杜教筛 强大的数

【51Nod 1237】最大公约数之和 V3 莫比乌斯反演+杜教筛

题意 求$\sum_{i=1}^{n}\sum_{j=1}^{n}(i,j)$ 枚举约数 $$ \begin{align} ans &=\sum_{d=1}^{n}\sum_{i=1}^{n}\sum_{j=1}^{n}[(i,j)=d] \ &=\sum_{d=1}^{n}\sum_{i=1}^{\lfloor \frac{n}{d} \rfloor}\sum_{j=1}^{\lfloor \frac{n}{d} \rfloor}[(i,j)=1] \ \end{align} $$ 利用

51nod1238 最小公倍数之和 V3 莫比乌斯函数 杜教筛

题意:求\(\sum_{i = 1}^{n}\sum_{j = 1}^{n}lcm(i, j)\). 题解:因为是用的莫比乌斯函数求的,所以推导比大部分题解多...而且我写式子一般都比较详细,所以可能看上去很多式子,实际上是因为每一步都写了,几乎没有跳过的.所以应该都可以看懂的. 末尾的\(e\)函数是指的\(e[1] = 1\),\(e[x] = 0(x != 1)\)这样一个函数 \[\sum_{i = 1}^{n}\sum_{j = 1}^{n}lcm(i, j)\] \[\sum_{i

【51nod-1239&amp;1244】欧拉函数之和&amp;莫比乌斯函数之和 杜教筛

题目链接: 1239:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1239 1244:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1244 杜教筛裸题,不过现在我也只会筛这俩前缀和... $$s(n)=\sum _{i=1}^{n}f(i)$$ 那么就有: $$\sum_{i=1}^{n}f(i)\lfloor \frac{n}{i} \

51nod1237 最大公约数之和 V3

n<=1e10,问1<=i<=n,1<=j<=n,gcd(i,j)的和%1e9+7. QAQ自推的第一道,虽然很简单而且走了很多弯路而且推错了一次被ccz大爷调教,但还是挺感动的.. 其实在推数论之前可以先打个$\mu$和$\varphi $的表,推个两三步就验证一下,否则如果是大数论题,推错的后果是极其严重的. $\sum_{i=1}^{n}\sum_{j=1}^{n}(i,j)$ $=\sum_{d=1}^{n}\sum_{i=1}^{n}\sum_{j=1}^{n}[(

【51nod】1238 最小公倍数之和 V3

[题意]给定n,求Σi=1~nΣj=1~n lcm(i,j),n<=10^10. [算法]杜教筛 [题解] $ans=\sum_{i=1}^{n}\sum_{j=1}^{i}lcm(i,j)$ 令$g(n)=\sum_{i=1}\frac{n*i}{(n,i)}$,则要求g(n)的前缀和. $g(n)=n\sum_{d|n}\sum_{i=1}^{n}\frac{i}{d}[(n,i)=d]$ $g(n)=n\sum_{d|n}\sum_{i=1}^{n/d}i[(n/d,i)=1]$ $g(n

杜教筛 学习总结

看了看唐老师的blog,照猫画虎的做了几道题目,感觉对杜教筛有些感觉了 但是稍微有一点难度的题目还是做不出来,放假的时候争取都A掉(挖坑ing) 这篇文章以后等我A掉那些题目之后再UPD上去就好啦 由于懒得去写怎么用编辑器写公式,所以公式就准备直接copy唐老师的啦 首先积性函数和完全积性函数什么的就不再多说了 列举常见的积性函数: 1.约数个数函数和约数个数和函数 2.欧拉函数phi 3.莫比乌斯函数mu 4.元函数e 其中e(n)=[n==1] 5.恒等函数I 其中I(n)=1 6.单位函数

杜教筛 与 数论函数(狄雷克卷积)

为了改变数论只会GCD的尴尬局面,我们来开一波数论: 数论函数: 数论函数是定义域在正整数的函数. 积性函数: f(ab)=f(a)f(b),gcd(a,b)=1 ,完全积性函数: f(ab)=f(a)f(b) . 常见积性函数: φ(n) ,μ(n) (莫比乌斯函数), d(n) (因子个数), σ(n) (因子和). 单位函数 : e(n)=[n=1] . 常见完全积性函数: Idk(n)=n^k , 1(n)=Id0(n) , Id(n)=Id1(n) . 我们 有以下令人窒息的操作: (