SP5971 LCMSUM 数论
题目要我们求这个:
\]
开始化式子:
\]
\]
\]
注意那个\(\sum_{i=1}^{d}i[gcd(i,d)=1]\)是求\([1,d]\)中所有与\(d\)互质的数的和,可以证明当\(d>1\)时,它等于\(\frac{d*\phi(d)}{2}\),证明如下:
对于每个\(i\),若它与\(d\)互质,则\(d-i\)也与\(d\)互质,每一对\(i\)与\(d-i\)的和为\(d\),所以平均每个与\(d\)互质的数的值为\(\frac{d}{2}\),一共有\(\phi(d)\)个与\(d\)互质的数,所以他们的和为\(\frac{d*\phi(d)}{2}\)
而与\(1\)互质的数的和显然为\(1\)
所以上式可化为
\]
\]
设\(g(n)=\sum_{d|n}d*\phi(d)\),上式化为:
\]
其中\(g(n)\)是一个积性函数,可以\(O(n)\)筛出
每次询问是\(O(1)\)的
总时间复杂度为\(O(n+T)\)
关于如何线筛出\(g(n)\):
\(n\)为质数:\(g(n)=1+n*\phi(n)=1+n*(n-1)\)
\(n=p^k\):
\]
\]
\]
\]
\]
\(n\)的最小质因子为\(p\):\(g(n)=g(n'*p^k)=g(n')*g(p^k)\)
然后就可以线性筛了
代码:
#include<bits/stdc++.h>
using namespace std;
#define N 1000007
#define ll long long
const int lim=1e6;
int pr[N],cnt,pk[N];
bool zhi[N];
ll f[N];
void Init()
{
int i,j;
f[1]=1;
for(i=2;i<=lim;i++)
{
if(!zhi[i])
{
pr[++cnt]=i,f[i]=1+1ll*i*(i-1);
pk[i]=i;
}
for(j=1;j<=cnt&&i*pr[j]<=lim;j++)
{
int p=pr[j],x=i*p;
zhi[x]=true;
if(i%p==0)
{
pk[x]=pk[i]*p;
f[x]=f[x/pk[x]]*(1+(1ll*pk[x]*pk[x]*p-p)/(p+1));
break;
}
pk[x]=p;
f[x]=f[i]*f[p];
}
}
for(i=1;i<=lim;i++)
f[i]=1ll*(f[i]-1)*i/2+i;
}
int main()
{
int t,n;
Init();
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
printf("%lld\n",f[n]);
}
return 0;
}
我原本的做法是用\(\mu\)暴力拆\([gcd(i,d)=1]\),但是那样做的复杂度是\(O(n\log n)\)的,也没有这个做法巧妙,这里就不讲了。
SP5971 LCMSUM 数论的更多相关文章
- bzoj 2226: [Spoj 5971] LCMSum 数论
2226: [Spoj 5971] LCMSum Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 578 Solved: 259[Submit][St ...
- BZOJ 2226 [Spoj 5971] LCMSum | 数论拆式子
题目: http://www.lydsy.com/JudgeOnline/problem.php?id=2226 题解: 题目要求的是Σn*i/gcd(i,n) i∈[1,n] 把n提出来变成Σi/g ...
- SP5971 LCMSUM - LCM Sum
一个基于观察不依赖于反演的做法. 首先 \(\rm lcm\) 是不好算的,转化为计算 \(\rm gcd\) 的问题,求: \[\sum\limits_{i = 1} ^ n \frac{in}{\ ...
- X000011
P1890 gcd区间 \(\gcd\) 是满足结合律的,所以考虑用 ST 表解决 时间复杂度 \(O((n\log n+m)\log a_i)\) 考虑到 \(n\) 很小,你也可以直接算出所有的区 ...
- 初等数论学习笔记 III:数论函数与筛法
初等数论学习笔记 I:同余相关. 初等数论学习笔记 II:分解质因数. 1. 数论函数 本篇笔记所有内容均与数论函数相关.因此充分了解各种数论函数的名称,定义,符号和性质是必要的. 1.1 相关定义 ...
- gcd套路变换
gcd套路变换 GCD https://www.luogu.org/problem/P2568 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. $ 1& ...
- BZOJ 2226 [Spoj 5971] LCMSum 最大公约数之和 | 数论
BZOJ 2226 [Spoj 5971] LCMSum 这道题和上一道题十分类似. \[\begin{align*} \sum_{i = 1}^{n}\operatorname{LCM}(i, n) ...
- bzoj 2401: 陶陶的难题I 数论
2401: 陶陶的难题I Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 89 Solved: 24[Submit][Status] Descript ...
- Codeforces Round #382 Div. 2【数论】
C. Tennis Championship(递推,斐波那契) 题意:n个人比赛,淘汰制,要求进行比赛双方的胜场数之差小于等于1.问冠军最多能打多少场比赛.题解:因为n太大,感觉是个构造.写写小数据, ...
随机推荐
- 如何在pycharm中设置环境变量
今天运行tensorflow的时候,发现在pycharm下,程序无法找到CUDA的libcupti.so文件.而在添加完环境变量: export LD_LIBRARY_PATH=$LD_LIBRARY ...
- Java线程池定制ThreadPoolExecutor官方定制实例
1.仍然先看构造方法:ThreadPoolExecutor构造方法 public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,lon ...
- 从 html 元素继承 box-sizing
在大多数情况下我们在设置元素的 border 和 padding 并不希望改变元素的 width,height值,这个时候我们就可以为该元素设置 box-sizing:border-box;. 我不希 ...
- 封装axios,带请求头和响应头
import axios from "axios"; import qs from "qs"; //处理参数 import router from '../ro ...
- javascript:void(0)的含义
void关键字介绍 首先,void关键字是javascript当中非常重要的关键字,该操作符指定要计算或运行一个表达式,但是不返回值. 语法格式: void func() void(func()) 实 ...
- 【 Android 】ViewPager + TabLayout + Fragment 数据初始化问题
在 ViewPager 和 Fragment 配合使用的时候,ViewPager 会使用预加载机制,使得我们在没有切换到到对应页面时,就已经加载好了,这是个非常不好的用户体验. 所以本示例项目就诞生了 ...
- Scroller——startScroll、fling(惯性滑动)
Scroller主要用于平滑滚动,主要使用的滚动方法有:startScroll.fling. startScroll(int startX, int startY, int dx, int dy, i ...
- Java DbUtils简介
Dbutils,db utils,顾名思义,是一个数据库工具,体积很小,算是一个dao层的小框架. DbUtils是Apache的开源项目,对JDBC进行了轻量级封装,极大地简化了JDBC编程. Db ...
- Golang: 读取文件并统计内容
上次我们从命令行接收用户输入,并统计了每次输入内容出现的次数,今天对程序加以改造,使其能够读取文件内容,并统计每行文本出现的次数. 首先,我们把接收输入的逻辑封装成一个函数: // scan.go p ...
- Odoo启动运行参数(script运行参数,不是运行配置文件)
转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10826315.html 一:启动选项用在哪里 如果你是用Pycharm进行odoo二次开发的话,可以通过 R ...