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

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

知识提要:小于等于n中与n互质的数总和为$\sum_{i=1}^{n}[(n,i)=1]i=\frac{\varphi(n)*n+[n=1]}{2}$

解析:

枚举最大公约数d,

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

我们先考虑 j<=i 的情况,

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

$$=\sum_{d=1}^{n}d\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\frac{\varphi(i)*i+[i=1]}{2}*i$$

还有i<=j的情况没考虑,其实两者是对称的 ,上面的式子乘2就好了,然后(1,1)这一对多算了一次了,所以-1就好了,

$$Ans=\sum_{d=1}^{n}d\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\varphi(i)*i^2$$

令$F(n)=\sum_{i=1}^{n}\varphi(i)*i^2$

$$Ans=\sum_{d=1}^{n}d*F(\lfloor\frac{n}{d}\rfloor)$$

欧拉函数的前缀和$\phi(n)$之前博客里写过 按照类似的方法可以推出来

$$F(n)=\frac{n^2*(n+1)^2}{4}-\sum_{i=2}^{n}\sum_{j=1}^{\lfloor\frac{n}{i}\rfloor}\varphi(j)*i^2*j^2\\$$
$$=\frac{n^2*(n+1)^2}{4}-\sum_{i=2}^{n}i^2\sum_{j=1}^{\lfloor\frac{n}{i}\rfloor}\varphi(j)*j^2\\$$
$$=\frac{n^2*(n+1)^2}{4}-\sum_{i=2}^{n}i^2F(\lfloor\frac{n}{i}\rfloor)$$

到此为止可以$O(n^{\frac{2}{3}})$求出Ans

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+,inf=0x3f3f3f3f;
typedef long long ll;
const ll mod = ;
typedef pair<int,int> pii;
int check[maxn],prime[maxn],phi[maxn],sum[maxn];
void Phi(int N)//线性筛
{
int pos=;sum[]=;
sum[]=phi[]=;
for(ll i = ; i <= N ; i++)
{
if (!check[i])
prime[pos++] = i,phi[i]=i-;
for (int j = ; j < pos && i*prime[j] <= N ; j++)
{
check[i*prime[j]] = ;
if (i % prime[j] == )
{
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
else
phi[i*prime[j]]=phi[i]*(prime[j]-);
}
sum[i]=(sum[i-]+(phi[i]*i%mod)*i%mod)%mod;
}
}
unordered_map<ll,ll> ma;
ll inv2=;
ll inv4=;
ll inv6=;
ll solve(ll n)
{
if(n<=1e6)
return sum[n];
else if(ma.count(n))
return ma[n];
ll temp = ((n%mod)*((n+)%mod)%mod)*inv2%mod;
temp=temp*temp%mod;
for(ll i=,j;i<=n;i=j+)
{
j=n/(n/i);
ll r=(((j%mod)*((j+)%mod)%mod)*((*j+)%mod)%mod)*inv6%mod;
ll l=(((i%mod)*((i-)%mod)%mod)*((*i-)%mod)%mod)*inv6%mod;
r=(r-l+mod)%mod;
temp = (temp-solve(n/i)*r%mod+mod)%mod;
}
return ma[n]=temp;
}
int main()
{
ll n;
Phi(1e6);
scanf("%lld",&n);
ll ans=;
for(ll i=,j;i<=n;i=j+)
{
j=n/(n/i);
ll r=((j%mod)*((j+)%mod)%mod)*inv2%mod;
ll l=((i%mod)*((i-)%mod)%mod)*inv2%mod;
r=(r-l+mod)%mod;
ans=(ans+solve(n/i)*r%mod)%mod;
}
printf("%lld\n",ans);
}

51 Nod 1238 最小公倍数之和 V3 杜教筛的更多相关文章

  1. 51NOD 1238 最小公倍数之和 V3 [杜教筛]

    1238 最小公倍数之和 V3 三种做法!!! 见学习笔记,这里只贴代码 #include <iostream> #include <cstdio> #include < ...

  2. 【51nod】1238 最小公倍数之和 V3 杜教筛

    [题意]给定n,求Σi=1~nΣj=1~n lcm(i,j),n<=10^10. [算法]杜教筛 [题解]就因为写了这个非常规写法,我折腾了3天…… $$ans=\sum_{i=1}^{n}\s ...

  3. 51 NOD 1238 最小公倍数之和 V3

    原题链接 最近被51NOD的数论题各种刷……(NOI快到了我在干什么啊! 然后发现这题在网上找不到题解……那么既然A了就来骗一波访问量吧…… (然而并不怎么会用什么公式编辑器,写得丑也凑合着看吧…… ...

  4. [51Nod1238]最小公倍数之和 V3[杜教筛]

    题意 给定 \(n\) ,求 \(\sum_{i=1}^n \sum_{j=1}^n lcm(i,j)\). \(n\leq 10^{10}\) 分析 推式子 \[\begin{aligned} an ...

  5. [51Nod 1238] 最小公倍数之和 (恶心杜教筛)

    题目描述 求∑i=1N∑j=1Nlcm(i,j)\sum_{i=1}^N\sum_{j=1}^Nlcm(i,j)i=1∑N​j=1∑N​lcm(i,j) 2<=N<=10102<=N ...

  6. 51NOD 1237 最大公约数之和 V3 [杜教筛]

    1237 最大公约数之和 V3 题意:求\(\sum_{i=1}^n\sum_{j=1}^n(i,j)\) 令\(A(n)=\sum_{i=1}^n(n,i) = \sum_{d\mid n}d \c ...

  7. 51nod 237 最大公约数之和 V3 杜教筛

    Code: #include <bits/stdc++.h> #include <tr1/unordered_map> #define setIO(s) freopen(s&q ...

  8. 51nod 1238 最小公倍数之和 V3

    51nod 1238 最小公倍数之和 V3 求 \[ \sum_{i=1}^N\sum_{j=1}^N lcm(i,j) \] \(N\leq 10^{10}\) 先按照套路推一波反演的式子: \[ ...

  9. 51nod 1238 最小公倍数之和 V3 【欧拉函数+杜教筛】

    首先题目中给出的代码打错了,少了个等于号,应该是 G=0; for(i=1;i<=N;i++) for(j=1;j<=N;j++) { G = (G + lcm(i,j)) % 10000 ...

随机推荐

  1. Voyager的路由

    修改默认的后台登录路由 打开web.php,把prefix值改为你想设置的值,如back: Route::group(['prefix' => 'back'], function () { Vo ...

  2. java代码导出数据到Excel、js导出数据到Excel(三)

     jsp内容忽略,仅写个出发按钮:          <button style="width: 100px" onclick="expertExcel()&quo ...

  3. CentOS 7 配置OpenCL环境(安装NVIDIA cuda sdk、Cmake、Eclipse CDT)

    序 最近需要在Linux下进行一个OpenCL开发的项目,现将开发环境的配置过程记录如下,方便查阅. 完整的环境配置需要以下几个部分: 安装一个OpenCL实现,基于硬件,选择NVIDIA CUDA ...

  4. CRC点滴

    研究了一个晚上,大致看懂了crc校验的方法.这里记录一下,因为can总线中需要用到crc校验的. 举例说明CRC校验码的求法:(此例子摘自百度百科:CRC校验码) 信息字段代码为: 1011001:对 ...

  5. UVALive - 8273 Assigning Frequencies (搜索 )

    n个点的一张图,问能否给每个点染上三种颜色中的一种,使得没有相邻的点颜色相同? n <= 35. Sample Input 4 6 6 0 3 1 5 3 2 2 5 0 4 1 0 7 12 ...

  6. [转] sublime插件

    Sublime Text 系列 Sublime Text:学习资源篇 Sublime插件:增强篇 Sublime插件:Markdown篇 Sublime插件:C语言篇 Sublime插件:主题篇 Su ...

  7. webdriver高级应用- 右键另存为下载文件

    1.要使用右键另存,需要先按照第三方工具AutoIt: 链接: https://pan.baidu.com/s/12aBBhOOTmyQpH9hukt0XGA 密码: fcdk 2.创建一个名为loa ...

  8. Python_Virtualenv及Pycharm配置

    Virtualenv存在的意义 在Python使用过程中,你是否有遇到过同时需要开发多个应用的情况? 假设A应用需要使用DJango1.X版本,而B应用需要使用DJango2.X的版本,而你全局开发环 ...

  9. [uiautomator篇][exist 存在,但click错误]

    uiautomator定位页面元素是,定位存在的;但是click的时候,发现点的位置不对,(不知道是android系统的问题还是uiautomator的问题,初步怀疑是系统的问题)

  10. Spring 4.3.11.RELEASE文档阅读(二):Core Technologies_IOC

    在看这部分内容的时候,想了一些问题: 容器: 1,什么是容器 用来包装或装载物品的贮存器 2,容器能做什么 包装或装载物品 3,为什么需要容器 为什么要使用集装箱?如果没有容器会是什么样? 4,常见的 ...