题目链接

  emm标题全称应该叫“莫比乌斯反演求出可狄利克雷卷积的公式然后卷积之后搞杜教筛”

  然后成功地困扰了我两天qwq

  我们从最基本的题意开始,一步步往下推

  首先题面给出的公式是$\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}ijgcd(i,j)$

  枚举gcd(i,j)=w,得到

  $\sum\limits_{w=1}^{n}w\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}ij[w=gcd(i,j)]$

  这时候我们设一个$f(x)=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}ij[x=gcd(i,j)]$

  一个$F(x)=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}ij[x|gcd(i,j)]$

  容易发现(其实就是为了凑莫比乌斯公式才搞的这两个函数,在构造函数之前就“容易发现”了)

  $F(x)=\sum\limits_{x|d}f(d)$

  怎么样……像莫比乌斯反演公式吧

  $f(d)=\sum\limits_{d|x}\mu(\frac{x}{d})F(x)$

  然后原式就变成了

  $\sum\limits_{w=1}^{n}w\sum\limits_{w|t}\mu(\frac{t}{w})F(t)$

  据说莫比乌斯反演构造的F(x)一定要简单易求

  然后……自己找几组规律可以发现$F(x)=(x+2x+3x+......+\frac{n}{x}x)^2$

  然后……继续找规律发现一个问题,就是你可以把x提出来。qwq。

  于是F(x)成功的变成了$x^2(1+2+3+......+\frac{n}{x})^2$

  然后我们回头去找扔掉的原式qwq

  原式=$\sum\limits_{w=1}^{n}w\sum\limits_{w|t}\mu(\frac{t}{w})F(t)$

  $=\sum\limits_{w=1}^{n}w^3\sum\limits_{w|t}\mu(\frac{t}{w})\frac{t}{w}^2(1+.......+\frac{n}{t})^2$

  emm我们似乎发现了什么……

  于是就设$d=\frac{t}{w}$

  然后把原式就整理成了

  $\sum\limits_{w=1}^{n}w^3\sum\limits_{d=1}^{\frac{n}{w}}\mu(d)d^2(1+.......+\frac{n}{wd})^2$

  到此为止就有60分啦。不需要杜教筛狄利克雷卷积什么乱七八糟的玩意。

  (然后剩下40分花掉了我一天+22个半小时)

  然后我自己差不多就想到这里为止了。剩下的是rqy的脑补。

  看到这里面一大堆下取整的玩意我们rqy非常不爽。

  然后他先把公式颠倒了一下

  $\sum\limits_{d=1}^{n}\mu(d)d^2\sum\limits_{w=1}^{\frac{n}{d}}w^3(1+......+\frac{n}{wd})^2$

  又令k=wd

  然后改成枚举k

  式子就变成了$\sum\limits_{k=1}^{n}\sum\limits_{d|k}\mu(\frac{k}{d})(\frac{k}{d})^2d^3(1+....+\frac{n}{k})^2$

  =$\sum\limits_{k=1}^{n}\sum\limits_{d|k}\mu(\frac{k}{d})k^2d(1+....+\frac{n}{k})^2$

  发现有两项$k^2$,$(1+....+\frac{n}{k})^2$跟d没什么卵关系

  提出来提出来

  $\sum\limits_{k=1}^{n}k^2(1+....+\frac{n}{k})^2\sum\limits_{d|k}\mu(\frac{k}{d})d$

  好,恭喜你$\sum\limits_{d|k}\mu(\frac{k}{d})d=\phi(k)$

  为什么呢?因为根据狄利克雷卷积公式$\mu*1=e$

  $\phi*1=n$

  所以$n*\mu=\phi*1*\mu=\phi*e=\phi$

  然后你列一列这个卷积公式。

  惊不惊喜?意不意外?

  然后原式变成了$\sum\limits_{k=1}^{n}k^2(1+....+\frac{n}{k})^2\phi(k)$

  然后一看到$\frac{n}{k}$有根号n种,非常激动,

  然后现在的问题就变成了怎么快速求$k^2\phi(k)$的前缀和

  然后发现这个玩意用杜教筛好像很可做的样子

  码了码了

  

#include<cstdio>
#include<cstring>
#include<cctype>
#include<cstdlib>
#include<algorithm>
#include<map>
#define maxn 4000100
using namespace std; map<long long,long long>_sum;
long long sum[maxn];
long long phi[maxn];
long long prime[maxn],tot;
bool vis[maxn];
long long mod;
long long mod6; long long Pow(long long n,long long i,long long p){
long long ret=;
while(i){
if(i&) ret=(ret*n)%p;
n=(n*n)%p;
i>>=;
}
return ret;
} inline long long calc(long long n,long long p){
n%=p;
long long ans=((+n)*n%p)*mod%p;
ans=(ans*ans)%p;
return ans;
} inline long long calcs(long long n,long long p){
n%=p;
long long ans=(n*(n+)%p)*(*n+)%p;
ans=ans*mod6%p;
return ans;
} long long calcsum(long long n,long long p){
if(n<maxn) return sum[n];
if(_sum.count(n)) return _sum[n];
long long x=,ans=calc(n,p);
while(x<=n){
long long y=n/(n/x);
ans=((ans-((calcs(y,p)-calcs(x-,p)+p)%p)*calcsum(n/x,p)%p)+p)%p;
x=y+;
}
return _sum[n]=ans;
} int main(){
long long p,n;
scanf("%lld%lld",&p,&n);
mod=Pow(,p-,p);
mod6=Pow(,p-,p);
vis[]=sum[]=;
for(register long long i=;i<maxn;++i){
if(!vis[i]){
prime[++tot]=i;
phi[i]=i-;
sum[i]=((1LL*i*i)%p*phi[i])%p;
}
for(long long j=;j<=tot&&i*prime[j]<maxn;++j){
vis[i*prime[j]]=;long long now=i*prime[j];
if(i%prime[j]){
phi[now]=(phi[i]*(prime[j]-))%p;
sum[now]=(phi[now]*now)%p*now%p;
}
else{
phi[now]=(phi[i]*prime[j])%p;
sum[now]=(phi[now]*now)%p*now%p;
break;
}
}
}
for(long long i=;i<maxn;++i) sum[i]=(sum[i]+sum[i-])%p;
long long x=,ans=;
while(x<=n){
long long y=n/(n/x);
ans+=((calcsum(y,p)-calcsum(x-,p)+p)%p)*calc(n/x,p)%p;
ans%=p;
x=y+;
}
printf("%lld",ans);
return ;
}

  然后这就是码qwq。

【Luogu】P3768简单的数学题(杜教筛)的更多相关文章

  1. luogu P3768 简单的数学题 杜教筛 + 欧拉反演 + 逆元

    求 $\sum_{i=1}^{n}\sum_{j=1}^{n}ijgcd(i,j)$   考虑欧拉反演: $\sum_{d|n}\varphi(d)=n$   $\Rightarrow \sum_{i ...

  2. P3768 简单的数学题 杜教筛+推式子

    \(\color{#0066ff}{ 题目描述 }\) 由于出题人懒得写背景了,题目还是简单一点好. 输入一个整数n和一个整数p,你需要求出(\(\sum_{i=1}^n\sum_{j=1}^n ij ...

  3. P3768 简单的数学题 [杜教筛,莫比乌斯反演]

    \[\sum_{i=1}^{n}\sum_{j=1}^{n} ij\gcd(i,j)\] \[=\sum_{d=1}^{n} d \sum_{i=1}^{n}\sum_{j=1}^{n} ij[\gc ...

  4. [luogu3768] 简单的数学题 [杜教筛]

    题面: 传送门 实际上就是求: 思路: 看到gcd就先反演一下,过程大概是这样: 明显的一步反演 这里设,S(x)等于1到x的和 然后把枚举d再枚举T变成先枚举T再枚举其约数d,变形: 后面其中两项展 ...

  5. Luogu P3768 简单的数学题

    非常恶心的一道数学题,推式子推到吐血. 光是\(\gcd\)求和我还是会的,但是多了个\(ij\)是什么鬼东西. \[\sum_{i=1}^n\sum_{j=1}^nij\gcd(i,j)=\sum_ ...

  6. Luogu 4213 【模板】杜教筛(Sum)

    当作杜教筛的笔记吧. 杜教筛 要求一个积性函数$f(i)$的前缀和,现在这个东西并不是很好算,那么我们考虑让它卷上另外一个积性函数$g(i)$,使$(f * g)$的前缀和变得方便计算,然后再反推出这 ...

  7. luogu P4213 【模板】杜教筛(Sum)

    Code: #include <bits/stdc++.h> #include <tr1/unordered_map> using namespace std; using n ...

  8. 「洛谷P3768」简单的数学题 莫比乌斯反演+杜教筛

    题目链接 简单的数学题 题目描述 输入一个整数n和一个整数p,你需要求出 \[\sum_{i=1}^n\sum_{j=1}^n (i\cdot j\cdot gcd(i,j))\ mod\ p\]  ...

  9. 洛谷P3768 简单的数学题 【莫比乌斯反演 + 杜教筛】

    题目描述 求 \[\sum\limits_{i=1}^{n} \sum\limits_{j=1}^{n} i*j*gcd(i,j) \pmod{p}\] \(n<=10^{10}\),\(p\) ...

随机推荐

  1. UVA 246 10-20-30 10-20-30游戏 模拟+STL双端队列deque

    Input Each input set consists of a sequence of 52 integers separated by spaces and/or ends of line. ...

  2. 从输入url到页面加载完成发生了什么详解

    这是一道经典的面试题,这道题没有一个标准的答案,它涉及很多的知识点,面试官会通过这道题了解你对哪一方面的知识比较擅长,然后继续追问看看你的掌握程度.当然我写的这些也只是我的一些简单的理解,从前端的角度 ...

  3. Google 出品的 Java 编码规范,强烈推荐,权威又科学!

    原文:google.github.io/styleguide/javaguide.html 译者:Hawstein 来源:hawstein.com/2014/01/20/google-java-sty ...

  4. java基础—基础语法1

    一.标识符

  5. LiteIDE 错误: 进程无法启动

    问题 运行 01_hello.go,提示以下错误 新建文件夹().exe [C:/Users/Administrator/Desktop/新建文件夹()] 错误: 进程无法启动. 原因 工程目录名不能 ...

  6. Java基础面试操作题: File IO 文件过滤器FileFilter 练习 把一个文件夹下的.java文件复制到另一个文件夹下的.txt文件

    package com.swift; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File ...

  7. 解决升级mac os X EI Capitan后遇到LibclangError: dlopen(libclang.dylib, 6): image not found.的问题

    打开文件./frameworks/cocos2d-x/tools/bindings-generator/clang/cindex.py 把第 3395 行 改为 : library = cdll.Lo ...

  8. JavaScript Dom编程艺术(1)

    Dom是一种可以供多种环境和多种程序设计语言使用的API: 一份文档就是一个节点树: 节电分为不同的类型:元素节点,属性节点,文档节点,元素节点分为属性节点和文档节点: getelementbyid( ...

  9. 【转】MFC编辑框自动换行,垂直滚动条自动下移

    1.新建一个编辑框控件(Edit Control),将其多行(Multiline)前面打勾(属性设置为True),Auto HScroll前面的勾去掉(属性设置False),这样就可以实现每一行填满后 ...

  10. Spring源码剖析依赖注入实现

    Spring源码剖析——依赖注入实现原理 2016年08月06日 09:35:00 阅读数:31760 标签: spring源码bean依赖注入 更多 个人分类: Java   版权声明:本文为博主原 ...