「洛谷P3768」简单的数学题 莫比乌斯反演+杜教筛
题目链接
题目描述
输入一个整数n和一个整数p,你需要求出
\]
其中\(gcd(a,b)\)表示\(a\)与\(b\)的最大公约数
输入
一行两个整数\(p,n\)
输出
一行一个整数,为题目中所求值
样例
样例输入
998244353 2000
样例输出
883968974
数据范围
\(n\leq 10^{10}\)
\(5\times 10^8 \leq p \leq 1.1\times 10^9\)
\(p\)为质数(但貌似也可以不是?又不用求逆元)
题解
自己想出来的题!但是连\(WA\)两发就是因为杜教筛写挂了……
先不考虑取余,我们化一下题目中的式子,枚举\(gcd\)(警告!多公式)。
\]
\]
\]
\]
额,现在可以使用分块优化做到\(O(n)\)了,但是这完全不能胜任数据范围,我们换个角度,设\(dp=T\),枚举\(T\)会有什么结果?
\]
\]
现在好像反而变成\(O(n\log n)\)或\(O(n\sqrt{n})\)了,别急,我们看看第二层的求和的意义——狄利克雷卷积,这是\(Id\)函数与\(\mu\)函数的狄利克雷卷积,其值就等于\(\varphi\)。
\]
现在,我们只需要快速求出一个东西即可——\(T^2\varphi(T)\),前面的部分可以分块优化,我们急需解决的就是这个函数\(f(T)=T^2\varphi(T)\)的前缀和\(F(T)\)。显然,这是一个积性函数。
杜教筛的公式:
\]
于是我们需要一个函数与\(f\)卷起来,我们根据套路或枚举发现\(T^2\)项很恼人,于是尝试把这一项消掉,于是想到了\(g(x)=x^2\)。
\]
\]
根据公式\(\sum_{d|i}\varphi(d)=i\),继续变形
\]
\]
由于\(p(i)=i^3\)和\(q(i)=i^2\)的前缀和都有公式,我们可以对右边进行分块优化,就可以杜教筛了!这道题圆满解决,时间复杂度\(O(n^{\frac{2}{3}})\)。
不过有些小细节要注意,比如模数乘\(2\)可能会爆\(int\),\(n^2\)可能会爆\(long\ long\),需要先取模再平方
\(Code:\)
#include <map>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define N 5000005
#define ll long long
map<ll, ll>Phi;
ll n, mod, g[N];
int p[N], h[N], phi[N], cnt;
ll sqr(ll x)
{
ll a = 2 * x + 1, b = x + 1, c = x;
if (b % 2 == 0)b /= 2;
else c /= 2;
if (a % 3 == 0)a /= 3;
else
if (b % 3 == 0)b /= 3;
else c /= 3;
a %= mod, b %= mod, c %= mod;
return a * b % mod * c % mod;
}
ll seq(ll x)
{
ll a = x + 1, b = x;
if (a % 2 == 0)a /= 2;
else b /= 2;
a %= mod, b %= mod;
return a * b % mod;
}
ll vas(ll x)
{
ll a = seq(x);
return a * a % mod;
}
ll G(ll x)
{
if (x <= N - 5)
return g[int(x)];
if (Phi.find(x) != Phi.end())
return Phi[x];
ll ans = vas(x);
ll lst = 1;
for (ll i = 2; i <= x; i++)
{
i = x / (x / i);
ll w = (sqr(i) - sqr(lst)) % mod;
ans = (ans - w * G(x / i) % mod) % mod;
lst = i;
}
if (ans < 0)
ans += mod;
Phi.insert(make_pair(x, ans));
return ans;
}
ll Ans(ll x)
{
ll ans = 0, lst = 0;
for (ll i = 1; i <= x; i++)
{
i = x / (x / i);
ll z = seq(x / i);
z = z * z % mod;
ans = (ans + z * (G(i) - G(lst)) % mod) % mod;
lst = i;
}
if (ans < 0)
ans += mod;
return ans;
}
int main()
{
phi[1] = 1;
for (int i = 2; i <= N - 5; i++)
{
if (!h[i])
{
phi[i] = i - 1;
p[++cnt] = i;
}
for (int j = 1; j <= cnt; j++)
{
if (i * p[j] > N - 5)
break;
h[i * p[j]] = 1;
if (i % p[j] == 0)
phi[i * p[j]] = phi[i] * p[j];
else
phi[i * p[j]] = phi[i] * (p[j] - 1);
}
}
cin >> mod >> n;
for (int i = 1; i <= N - 5; i++)
g[i] = (g[i - 1] + 1ll * phi[i] * i % mod * i % mod) % mod;
cout << Ans(n) << '\n';
}
「洛谷P3768」简单的数学题 莫比乌斯反演+杜教筛的更多相关文章
- luogu 3768 简单的数学题 (莫比乌斯反演+杜教筛)
题目大意:略 洛谷传送门 杜教筛入门题? 以下都是常规套路的变形,不再过多解释 $\sum\limits_{i=1}^{N}\sum\limits_{j=1}^{N}ijgcd(i,j)$ $\sum ...
- 洛谷P3768 简单的数学题 莫比乌斯反演+杜教筛
题意简述 求出这个式子 \[ \sum_{i=1}^n\sum_{j=1}^n ij(i,j) \bmod p \] 做法 先用莫比乌斯反演拆一下式子 \[ \begin{split} \sum_{i ...
- LOJ#6229. 这是一道简单的数学题(莫比乌斯反演+杜教筛)
题目链接 \(Description\) 求\[\sum_{i=1}^n\sum_{j=1}^i\frac{lcm(i,j)}{gcd(i,j)}\] 答案对\(10^9+7\)取模. \(n< ...
- 洛谷P3768 简单的数学题 【莫比乌斯反演 + 杜教筛】
题目描述 求 \[\sum\limits_{i=1}^{n} \sum\limits_{j=1}^{n} i*j*gcd(i,j) \pmod{p}\] \(n<=10^{10}\),\(p\) ...
- 洛谷 P6860 - 象棋与马(找性质+杜教筛)
题面传送门 首先我们来探究一下什么样的 \((a,b)\) 满足 \(p(a,b)=1\).不难发现只要点 \((1,0)\) 能够到达,那么网格上所有点都能到达,因为由于 \((1,0)\) 能够到 ...
- EOJ Monthly 2019.11 E. 数学题(莫比乌斯反演+杜教筛+拉格朗日插值)
传送门 题意: 统计\(k\)元组个数\((a_1,a_2,\cdots,a_n),1\leq a_i\leq n\)使得\(gcd(a_1,a_2,\cdots,a_k,n)=1\). 定义\(f( ...
- 「区间DP」「洛谷P1043」数字游戏
「洛谷P1043」数字游戏 日后再写 代码 /*#!/bin/sh dir=$GEDIT_CURRENT_DOCUMENT_DIR name=$GEDIT_CURRENT_DOCUMENT_NAME ...
- 「洛谷1903」「BZOJ2120」「国家集训队」数颜色【带修莫队,树套树】
题目链接 [BZOJ传送门] [洛谷传送门] 题目大意 单点修改,区间查询有多少种数字. 解法1--树套树 可以直接暴力树套树,我比较懒,不想写. 稍微口胡一下,可以直接来一个树状数组套主席树,也就是 ...
- 「洛谷4197」「BZOJ3545」peak【线段树合并】
题目链接 [洛谷] [BZOJ]没有权限号嘤嘤嘤.题号:3545 题解 窝不会克鲁斯卡尔重构树怎么办??? 可以离线乱搞. 我们将所有的操作全都存下来. 为了解决小于等于\(x\)的操作,那么我们按照 ...
随机推荐
- web编程的初步认识
一直以后, 只知道打开浏览器, 输入网址便可以上网浏览网页, 但是当认真琢磨起这web编程的时候, 对于很多细节却是感觉很迷惑, 在慢慢的学习中, 才逐渐有了些了解. web有client/serve ...
- 2016.2.24 利用用户控件和委托完美解决快速选择txbbox
1.首先将tet_box和一个datagridview控件打包成用户控件uC_QuickTxtBox 2.在用户控件中定义执行主窗口的委托函数 3.主窗体中添加用户控件的load事件,赋值 uC_Qu ...
- mui封装的ajax请求
由于项目中引进MUI框架,所以就不需要引进jquery,但需要和后台交互时,常写为jquery格式:所以笔者觉得有必要将mui封装的ajax请求在这里提一下: 1,mui框架基于htm5plus的XM ...
- URL网址参数解析类
/** * Created by myc on 2015/12/9. */ import android.text.TextUtils; import java.util.HashMap; impor ...
- 重命名File
File completeFile = new File(mFilePath + mFileName); if (completeFile.exists()) { File fileWithSuffi ...
- GTK编程
一.简介 GTK(GIMP Toolkit)是一套跨多种平台的图形工具包,按LGPL许可协议发布的.虽然最初是为GIMP写的,但早已发展为一个功能强大.设计灵活的通用图形库.特别是被GNOME选中使得 ...
- 转换流 Properties集合 序列化 工具
今日内容介绍1.转换流2.缓冲流3.Properties集合4.序列化流与反序列化流5.commons-IO============================================== ...
- CodeForces 404D Minesweeper 1D (DP)
题意:给定一个序列,*表示雷,1表示它旁边有一个雷,2表示它旁边有两个雷,0表示旁边没有雷,?表示未知,求有多少情况. 析:dp[i][j] 表示第 i 个放 j 状态,有多少种情况,然后很简单的DP ...
- php数据连接
<?php header("Content-type: text/html;charset=utf-8");//设置编码格式为UTF-8 error_reporting(E_ ...
- linux没有wifi
linux的wifi出现问题的介绍 几次重装linux系统,经常出现没有wifi的状况 错误详情 之前安装过CentOS,Kylin,OpenSU,等等经常出现没有wifi的状况,虽说猜测是遇到驱动问 ...