51nod1363 最小公倍数之和
题目描述
给出一个n,求1-n这n个数,同n的最小公倍数的和。
例如:n = 6,1,2,3,4,5,6 同6的最小公倍数分别为6,6,6,12,30,6,加在一起 = 66。
由于结果很大,输出Mod 1000000007的结果。
输入
第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 50000)
第2 - T + 1行:T个数A[i](A[i] <= 10^9)
输出
共T行,输出对应的最小公倍数之和
输入样例
3
5
6
9
输出样例
55
66
279
题解
&n\sum{\frac{i}{(i,n)}}\\
&=n\sum_{d|n}{\sum_{i=1}^n{\frac{i}{d}}}[(i,n)=d]\\
&=n\sum_{d|n}\sum_{i=1}^{\frac{n}{d}}i[(i,\frac{n}{d})=1]\\
&=n\sum_{d|n}φ(\frac{n}{d})\frac{n}{2d}\\
&=\frac{n}{2}\left(\sum_{d|n}φ(d)d+1\right)\\
\end{aligned}
\]
考虑\(\sum_{d|n}φ(d)d\)是个积性函数。
证明:
\[\begin{aligned}
&设x,y互质\\
&\sum_{d|n}φ(d)d=1*(φ·id)\\
&1*(φ(x)·x\timesφ(y)·y)=1*(φ(xy)·xy)
\end{aligned}
\]
则对于每个p,都有
\]
p的x次方也类似。根据唯一分解定理,我们可以得到下面的推论:
&设f(n)=\sum_{d|n}φ(d)d\\
&f(n)=f(p_1^{c_1})*f(p_2^{c_2})*...*f(p_k^{c_k})
\end{aligned}
\]
我们知道\(φ\)函数的一个性质:对于\(n=p^k\),有\(φ(p^k)=p^k-p^{k-1}\)。所以可以预处理质数,然后来分解质因数,对每个质因子算出\(f(p_i^{c_i})\),然后乘起来就好了。(这样复杂度是\(O(\frac{\sqrt{n}}{\log n})\)的,如果不先预处理质数就是\(O(\sqrt{n})\)的,会TLE)
这样子的话常数也是很小的,在51nod跑到了第一页(rk17)。
个人感觉这个做法好写好想啊...为什么网上都没这个做法的题解...都是好麻烦的考虑贡献
#include <bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
#define il inline
namespace io {
#define in(a) a = read()
#define out(a) write(a)
#define outn(a) out(a), putchar('\n')
#define I_int ll
inline I_int read() {
I_int x = 0, f = 1;
char c = getchar();
while (c < '0' || c > '9') {
if (c == '-') f = -1;
c = getchar();
}
while (c >= '0' && c <= '9') {
x = x * 10 + c - '0';
c = getchar();
}
return x * f;
}
char F[200];
inline void write(I_int x) {
if (x == 0) return (void) (putchar('0'));
I_int tmp = x > 0 ? x : -x;
if (x < 0) putchar('-');
int cnt = 0;
while (tmp > 0) {
F[cnt++] = tmp % 10 + '0';
tmp /= 10;
}
while (cnt > 0) putchar(F[--cnt]);
}
#undef I_int
}
using namespace io;
using namespace std;
const ll mod = 1e9 + 7;
#define N 1000010
int T = read();
int p[N], cnt;
bool vis[N];
void init(int n) {
cnt = 0;
for(int i = 2; i <= n; ++i) {
if(!vis[i]) p[++cnt] = i;
for(int j = 1; j <= cnt && i * p[j] <= n; ++j) {
vis[i * p[j]] = 1;
if(i % p[j] == 0) break;
}
}
}
ll power(ll a, ll b) {
ll ans = 1;
while(b) {
if(b & 1) ans = ans * a % mod;
a = a * a % mod; b >>= 1;
} return ans;
}
ll inv2 = power(2, mod-2);
ll solve(ll n) {
ll ans = 1;
for(int i = 1; p[i] * p[i] <= n && i <= cnt; ++i) {
if(n % p[i] == 0) {
ll now = 1, sum = 1;
while(n % p[i] == 0) {
n /= p[i];
now *= (ll)p[i];
sum += (ll)(now - now / p[i]) * now;
}
ans = ans * sum % mod;
}
}
if(n > 1) {ans = ans * (1 + n * (n - 1) % mod) % mod;}
return ans + 1ll;
}
int main() {
init(35000);
while(T--) {
ll n = read();
outn(solve(n)*(n*inv2%mod)%mod);
}
}
51nod1363 最小公倍数之和的更多相关文章
- 51nod-1363: 最小公倍数之和
[传送门:51nod-1363] 简要题意: 给出一个数n,求出1到n的数与n的最小公倍数的和 多组数据 题解: 理所当然推柿子 原题相当于求$\sum_{i=1}^{n}\frac{i*n}{gcd ...
- 51NOD 1238 最小公倍数之和 V3 [杜教筛]
1238 最小公倍数之和 V3 三种做法!!! 见学习笔记,这里只贴代码 #include <iostream> #include <cstdio> #include < ...
- 51nod 1238 最小公倍数之和 V3
51nod 1238 最小公倍数之和 V3 求 \[ \sum_{i=1}^N\sum_{j=1}^N lcm(i,j) \] \(N\leq 10^{10}\) 先按照套路推一波反演的式子: \[ ...
- 51nod 1190 最小公倍数之和 V2
给出2个数a, b,求LCM(a,b) + LCM(a+1,b) + .. + LCM(b,b). 例如:a = 1, b = 6,1,2,3,4,5,6 同6的最小公倍数分别为6,6,6,12,30 ...
- 51nod 1363 最小公倍数之和 ——欧拉函数
给出一个n,求1-n这n个数,同n的最小公倍数的和.例如:n = 6,1,2,3,4,5,6 同6的最小公倍数分别为6,6,6,12,30,6,加在一起 = 66. 由于结果很大,输出Mod 1000 ...
- 51Nod 最大公约数之和V1,V2,V3;最小公倍数之和V1,V2,V3
1040 最大公约数之和 给出一个n,求1-n这n个数,同n的最大公约数的和.比如:n = 6 1,2,3,4,5,6 同6的最大公约数分别为1,2,3,2,1,6,加在一起 = 15 输入 1个数N ...
- BNU 12846 LCM Extreme 最小公倍数之和(线性欧拉筛选+递推)
LCM Extreme Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVALive. Orig ...
- 51 NOD 1238 最小公倍数之和 V3
原题链接 最近被51NOD的数论题各种刷……(NOI快到了我在干什么啊! 然后发现这题在网上找不到题解……那么既然A了就来骗一波访问量吧…… (然而并不怎么会用什么公式编辑器,写得丑也凑合着看吧…… ...
- 51nod1238 最小公倍数之和 V3 莫比乌斯函数 杜教筛
题意:求\(\sum_{i = 1}^{n}\sum_{j = 1}^{n}lcm(i, j)\). 题解:虽然网上很多题解说用mu卡不过去,,,不过试了一下貌似时间还挺充足的,..也许有时间用phi ...
随机推荐
- Exception in thread "main" java.lang.UnsupportedClassVersionError: org/apache/maven/cli/MavenCli : Unsupported major.minor version 51.0
原因:JDK版本不兼容.运行的Java Class文件采用高版本的JDK编译,然后在低版本的JRE环境中运行,有时会报此错误. 解决:1)升级JDK 2)调整Eclipse中Java Compiler ...
- Java如何获取JSON数据中的值
场景:在接口自动化场景中,下个接口发送的请求参数,依赖上个接口请求结果中的值.需要将获取值作为全局参数引用. import java.io.File; import java.io.FileInput ...
- Vue.js中集成summernote
首先引用summernote样式及js: <!--summernote css --> <link href="${ctxPath}/static/css/summerno ...
- Python 进阶 异步async/await
一,前言 本文将会讲述Python 3.5之后出现的async/await的使用方法,我从上看到一篇不错的博客,自己对其进行了梳理.该文章原地址https://www.cnblogs.com/dhcn ...
- Android 浏览器内 H5 电脑 Chrome 调试
Android 浏览器内 H5 调试 chrome://inspect 移动前端调试方案(Android + Chrome 实现远程调试) adb 相关资源 adb shell(ADB Kits)下载 ...
- 关于表情的战争APP隐私政策网址
本软件尊重并保护所有使用服务用户的个人隐私权.为了给您提供更准确.更有个性化的服务,本软件会按照本隐私权政策的规定使用和披露您的个人信息.但本软件将以高度的勤勉.审慎义务对待这些信息.除本隐私权政策另 ...
- Vue一、起步
1.参考资料-官网 https://cn.vuejs.org/v2/guide/ 2.介绍 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架 与其它大型框架不同,V ...
- 使用 AudioContext 播放音频 解决 谷歌禁止自动播放音频
window.AudioContext = window.AudioContext || window.webkitAudioContext || window.mozAudioContext || ...
- OOA/OOD/OOP
转载自https://www.cnblogs.com/zzyoucan/p/3576932.html Object-Oriented Analysis:面向对象分析方法 是在一个系统的开发过程中进行了 ...
- Ubuntu 16.04 安装 Apache, MySQL, PHP7.2
先更新系统 sudo apt update 安装PHP 通过修改PPA源的方式来安装 sudo apt-get install software-properties-common python-so ...