2019CCPC网络赛 HD6707——杜教筛

题意

求 $f(n,a,b)=\sum_{i=1}^n \sum_{j=1}^i gcd(i^a-j^a,i^b-j^b)[gcd(i,j)=1]\%(10^9+7)$,$1 \le n,a,b \le 10^9$,共有 $T$ 组测试,其中只有10组的 $n$ 大于 $10^6$.

分析

首先,当 $i, j$互质,$a, b$互质时,有 $gcd(i^a-j^a,i^b-j^b)=i-j$(证明见 链接),也可以打表猜一猜嘛。

可以推出:$$\sum_{d=1}^{N}\mu(d)\cdot d\sum_{i=1}^{\lfloor\frac{N}{d}\rfloor}\sum_{j=1}^{i}(i-j)$$

单独考虑后半部分,$\sum_{i=1}^{k}\sum_{j=1}^{i}(i-j)=\frac{k^3-k}{6}$.

然后,只剩下左边的 $\mu(d)\cdot d$,

将其与恒等函数 $Id(n) = n$ 狄利克雷卷积后得

$$\begin{align*}
(\mu(d)\cdot d)*Id(d)
& =  \sum_{d|n}(\mu(d)\cdot d)\cdot Id(\frac{n}{d})\\
& = \sum_{d|n}\mu(d) =  [n=1]
\end{align*}$$

接下来套杜教筛得公式

$$\begin{align*}
S(n)
& = \sum\limits_{i=1}^n [i=1]-\sum\limits_{i=2}^ni\cdot S(\lfloor\dfrac{n}{i}\rfloor)\\
& = 1-\sum\limits_{i=2}^ni\cdot S(\lfloor\dfrac{n}{i}\rfloor)
\end{align*}$$

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
const int maxn = 6e6 + 10;
const ll mod = 1e9+7;
const ll inv6 = 166666668;
int sum[maxn], mu[maxn], pri[maxn], pn;
bool vis[maxn];
map<int, int>mp_sum;
int n, a, b;

ll s2(ll i, ll j)
{
    return (i+j) * (j-i+1) / 2 % mod;
}

ll s3(ll k)
{
    return (k*k%mod - 1) * k % mod * inv6 % mod;
}

ll S(ll x)
{
    if(x < maxn)  return sum[x];
    if(mp_sum[x])  return mp_sum[x];
    ll ret = 1LL;
    for(int i = 2, j;i <= x;i = j+1)
    {
        j = x / (x / i);
        ret = (ret - s2(i, j) * (S(x/i))%mod) % mod;
    }
    return  mp_sum[x] = (ret + mod) % mod;
}

void pre()
{
    mu[1] = 1;
    for(int i = 2;i < maxn;i++)
    {
        if(!vis[i])
        {
            pri[++pn] = i;
            mu[i] = -1;
        }
        for(int j = 1;j <= pn && i * pri[j] < maxn; j++)
        {
            vis[i * pri[j]] = true;
            if(i % pri[j])  mu[i * pri[j]] = -mu[i];
            else
            {
                mu[i * pri[j]] = 0;
                break;
            }
        }
    }
    for(int i = 1;i < maxn;i++)  sum[i] = (sum[i-1] + i * mu[i]) % mod;
}

int main()
{
    pre();

    int T;
    scanf("%d", &T);
    while(T--)
    {
        scanf("%d%d%d", &n, &a, &b);
        ll ans  = 0;
        for(ll l = 1,r; l <= n;l = r+1)
        {
            r = n / (n / l);
            ans = (ans + (S(r) - S(l-1)) * s3(n/l)) % mod;
        }
        printf("%lld\n", (ans+mod)%mod);
    }
    return 0;
}

最开始开的 MAXN=2e6,会TLE;原博客开的6e6,又MLE,将long long 数组改成 int 才行。

其实标答是推成 $\displaystyle ans = \frac{\sum _{i=1}^n i\varphi (i) - 1}{2}$,少了一次整除分块。

但是,通过这种解法,让我深刻认识了杜教筛的时空矛盾该怎么平衡。

参考链接:https://segmentfault.com/a/119000002017183

原文地址:https://www.cnblogs.com/lfri/p/11410031.html

时间: 2024-11-09 01:41:19

2019CCPC网络赛 HD6707——杜教筛的相关文章

HDU6706 CCPC 2019网络赛 huntian oy 推式子+杜教筛

CCPC 2019 网络赛 HDU 6706 huntian oy 标签 奇奇怪怪的数论结论 杜教筛 前言 我的csdn和博客园是同步的,欢迎来访danzh-博客园~ 简明题意 给定n,a,b,求: \[\sum_{i=1}^n\sum_{j=1}^igcd(i^a-j^a,i^b-j^b)[gcd(i,j)=1]\%(10^9+7)\] 思路 首先有一个结论: \[gcd(i^a-j^a,i^b-j^b)=i^{gcd(a,b)}-j^{gcd(a,b)}\] 上面的结论对于i,j互质是成立的

CCPC 2019 网络赛 HDU huntian oy (杜教筛)

1005 huntian oy (HDU 6706) 题意: 令,有T次询问,求 f(n, a, b). 其中 T = 10^4,1 <= n,a,b <= 1e9,保证每次 a,b互质. 思路: 首先我们需要知道 公式: gcd(a^n - b^n, a^m - b^m) = a^(gcd(m,n)) - b^(gcd(m,n)) 由a,b互质,原式即为 f(n, a, b) = ∑∑ (i-j)*[(i,j)=1] = ∑ (i*∑ [(i, j)=1] ) - ∑∑ j*[(i, j)=

【学术篇】分析矿洞 杜教筛

数论什么的都去死吧! 看着题解我都能化式子用完4页草纸... 另外吐槽一句出题人的拼音学的是真好, 不知道是不是故意的. 其实题解已经写得挺详细的了. 我就是提一些出题人觉得太easy没必要提但是做题还是需要的一些东西....(因为这些东西我基本都是现学的) 然而之前刚刚学完mobius反演就暂时性脱坑的我啥也不会啊.. 看到前排dp和曲神在水luogu的欢(bao/du)乐(ling/liu)赛, 就想去看看. 然后就点了报名但是发现自己什么都不会. 去看了看T1. 就是这道题. 然后成功的化

杜教筛之逆运算

前言: 下面介绍的这种方法并不常见,但是非常的有用 准确来说,我是来拓荒的,所以有什么问题请一定指出 前置技能: 积性函数 狄利克雷卷积 一定式子转化能力 其实对杜教筛知识点方面要求并不是很高 简单介绍几种常用积性函数: \(1.\text{欧拉函数:}\phi(x)=\text{ 1-x与x互质的数的个数}\) \(2.\text{莫比乌斯函数:}\mu(x)\text{ 这个函数定义难以描述,可以自行查找}\) \(3.\text{约数个数:}d(x)=\sum_{d|x}1\) \(4.\

【bzoj 4176】 Lucas的数论 莫比乌斯反演(杜教筛)

Description 去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么喜欢了. 在整理以前的试题时,发现了这样一道题目“求Sigma(f(i)),其中1<=i<=N”,其中 表示i的约数个数.他现在长大了,题目也变难了. 求如下表达式的值: 一行一个整数ans,表示答案模1000000007的值. Sample Input 2 Sample Output 8 HINT 对于100%的数据n <= 10^9. 题解: 解锁新技能:杜教筛. 再复习一下: 若$F(n)=\s

【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} \

杜教筛 学习总结

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

【BZOJ4916】神犇和蒟蒻 杜教筛

[BZOJ4916]神犇和蒟蒻 Description 很久很久以前,有一只神犇叫yzy; 很久很久之后,有一只蒟蒻叫lty; Input 请你读入一个整数N;1<=N<=1E9,A.B模1E9+7; Output 请你输出一个整数A=\sum_{i=1}^N{\mu (i^2)}; 请你输出一个整数B=\sum_{i=1}^N{\varphi (i^2)}; Sample Input 1 Sample Output 1 1 题解:哎?上面的那个东西好像一直是1?(废话),然后 设j=i/d,

【bzoj4176】Lucas的数论 莫比乌斯反演+杜教筛

题目描述 去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么喜欢了. 在整理以前的试题时,发现了这样一道题目“求Sigma(f(i)),其中1<=i<=N”,其中 表示i的约数个数.他现在长大了,题目也变难了. 求如下表达式的值: 其中f(ij)表示ij的约数个数. 他发现答案有点大,只需要输出模1000000007的值. 输入 第一行一个整数n. 输出 一行一个整数ans,表示答案模1000000007的值. 样例输入 2 样例输出 8 题解 莫比乌斯反演+杜教筛 首先有个神奇