【51nod】1227 平均最小公倍数
题解
这个故事告诉们数论函数不要往分式上跑,你推不出来
好久没推式子了这么明显的转化我都忘了= =
首先\(A(n) = \frac{1}{n} \sum_{i = 1}^{n} \frac{i * n}{gcd(i,n)}\)
然后显然可以把n消掉
\(A(n) = \sum_{i = 1}^{n} \frac{i}{gcd(i,n)}\)
改为枚举约数
\(A(n) = \sum_{d = 1}^{n} \frac{1}{d}\sum_{i = 1}^{n} i [gcd(i,n) == d]\)
\(A(n) = \sum_{d | n} \sum_{i = 1}^{\frac{n}{d}} i [gcd(i,\frac{n}{d}) == 1]\)
有个欧拉函数的性质是,小于这个数的且与这个数互质的数的和是
\(\frac{n \phi(n) + [n = 1]}{2}\) 挺好理解的,因为一个与n互质的数p,n - p也和n互质
\(\frac{n \phi(n) + [n = 1]}{2} = \sum_{i = 1}^{n} i [gcd(i,n) == 1]\)
\(A(n) = \frac{1}{2} (\sum_{d | n} \frac{n}{d} \phi(\frac{n}{d}) + 1)\)
\(F(n) = \sum_{i = 1}^{n} A(i)\)
\(F(n) = \frac{1}{2} (\sum_{i = 1}^{n} \sum_{d | i} \frac{i}{d} \phi(\frac{i}{d}) + n)\)
\(F(n) = \frac{1}{2} (\sum_{i = 1}^{n} \sum_{d | i} d \phi(d) + n)\)
\(F(n) = \frac{1}{2} (\sum_{i = 1}^{n} \sum_{d = 1}^{\frac{n}{i}} d \phi(d) + n)\)
我们发现这个东西可以构造卷积啊
\(\sum_{d = 1}^{n} d \phi(d)\)
卷上一个\(Id(x) = x^{2}\)
那么我们就有
\(\sum_{i = 1}^{n} i^2 = \sum_{i = 1}^{n} \sum_{d | i}d \phi(d) \frac{i}{d}\)
\(\sum_{i = 1}^{n} i^2 = \sum_{k = 1}^{n} k \sum_{d = 1}^{\frac{n}{k}}d \phi(d)\)
那么就有
\(S(n) = \frac{n(n +1)(2n + 1)}{6} - \sum_{i = 2}^{n} i S(\lfloor \frac{n}{i} \rfloor)\)
然后用数论分块求\(F(n)\)即可
题解
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <map>
//#define ivorysi
#define pb push_back
#define space putchar(' ')
#define enter putchar('\n')
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define mo 974711
#define MAXN 1000000
#define RG register
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {
res = 0;char c = getchar();T f = 1;
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 + c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {putchar('-');x = -x;}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
int N;
const int MOD = 1000000007;
struct node {
int x,v,next;
}E[100006];
int head[mo + 5],sumE,Inv2,Inv6;
int prime[MAXN + 5],tot,S[MAXN + 5],phi[MAXN + 5];
bool nonprime[MAXN + 5];
int inc(int a,int b) {
a = a + b;
if(a >= MOD) a -= MOD;
return a;
}
int mul(int a,int b) {
return 1LL * a * b % MOD;
}
void add(int u,int x,int v) {
E[++sumE].x = x;E[sumE].v = v;E[sumE].next = head[u];
head[u] = sumE;
}
void Insert(int x,int v) {
add(x % mo,x,v);
}
int Query(int x) {
int u = x % mo;
for(int i = head[u] ; i ; i = E[i].next) {
if(E[i].x == x) return E[i].v;
}
return -1;
}
int f(int x) {
if(x <= MAXN) return S[x];
int c = Query(x);
if(c != -1) return c;
int res = 0;
for(int i = 2 ; i <= x ; ++i) {
int r = x / (x / i);
res = inc(res,1LL * (r - i + 1) * (r + i) / 2 % MOD * f(x / i) % MOD);
i = r;
}
res = inc(1LL * x * (x + 1) % MOD * (2 * x + 1) % MOD * Inv6 % MOD,MOD - res);
Insert(x,res);
return res;
}
int calc(int x) {
int res = 0;
for(int i = 1 ; i <= x ; ++i) {
int r = x / (x / i);
res = inc(res,mul(r - i + 1,f(x / i)));
i = r;
}
res = inc(res,x);
res = mul(res,Inv2);
return res;
}
void Solve() {
phi[1] = 1;S[1] = 1;
for(int i = 2 ; i <= MAXN ; ++i) {
if(!nonprime[i]) {
prime[++tot] = i;
phi[i] = i - 1;
}
for(int j = 1 ; j <= tot ; ++j) {
if(prime[j] > MAXN / i) break;
nonprime[prime[j] * i] = 1;
if(i % prime[j] == 0) {phi[i * prime[j]] = phi[i] * prime[j];break;}
else phi[i * prime[j]] = phi[i] * (prime[j] - 1);
}
S[i] = inc(S[i - 1],mul(phi[i],i));
}
Inv2 = (MOD + 1) / 2;
Inv6 = 1LL * Inv2 * (MOD + 1) / 3 % MOD;
int a,b;
read(a);read(b);
out(inc(calc(b),MOD - calc(a - 1)));enter;
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
return 0;
}
【51nod】1227 平均最小公倍数的更多相关文章
- 51NOD 1227 平均最小公倍数 [杜教筛]
1227 平均最小公倍数 题意:求\(\frac{1}{n} \sum_{i=1}^n lcm(n,i)\) 和的弱化版? \[ ans = \frac{1}{2}((\sum_{i=1}^n \su ...
- 51nod 1227 平均最小公倍数【欧拉函数+杜教筛】
以后这种题能用phi的就不要用mu-mu往往会带着个ln然后被卡常致死 把题目要求转换为前缀和相减的形式,写出来大概是要求这样一个式子: \[ \sum_{i=1}^{n}\sum_{j=1}^{i} ...
- 51 nod 1227 平均最小公倍数
原题链接 Lcm(a,b)表示a和b的最小公倍数,A(n)表示Lcm(n,i)的平均数(1 <= i <= n), 例如:A(4) = (Lcm(1,4) + Lcm(2,4) + Lcm ...
- 51NOD 1227:平均最小公倍数——题解
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1227 懒得打公式了,看这位的吧:https://blog.csdn.ne ...
- 【51Nod 1222】最小公倍数计数
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1222 求\([a,b]\)中的个数转化为求\([1,b]\)中的个数减去 ...
- 【51nod】1222 最小公倍数计数 莫比乌斯反演+组合计数
[题意]给定a和b,求满足a<=lcm(x,y)<=b && x<y的数对(x,y)个数.a,b<=10^11. [算法]莫比乌斯反演+组合计数 [题解]★具体 ...
- 【51Nod 1238】最小公倍数之和 V3
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1238 设\(A(n)=\sum\limits_{i=1}^n\frac{ ...
- 【51Nod 1190】最小公倍数之和 V2
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1190 \[ \begin{aligned} &\sum_{i=a ...
- 【51Nod 1363】最小公倍数之和
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1363 \[ \begin{aligned} &\sum_{i=1 ...
随机推荐
- Android开发-eclipse+phonegap(Cordova)环境搭建
搭建步骤: 一.安装java [官网下载].eclipse+ADT+Android SDK [点我下载x86(android-22)] | [adt-bundle-windows-x86_64-201 ...
- Meeting HDU - 5521 虚点建图
Problem Description Bessie and her friend Elsie decide to have a meeting. However, after Farmer John ...
- Ubuntu 下安装sqlite3 及常用SQL 语句
安装sqlite3命令如下: sudo apt-get install sqlite3 创建或者打开已有的数据库文件: sqlite3 test.db 进入数据库后,可以进行以下常用SQL语句操作: ...
- centos7 mysql5.7.17源码安装
**安装前准备 操作系统环境:Centos 7.2 1.解决依赖包并下载源码包至/home/soft/目录下 1 2 3 4 5 6 7 [root@node03 ~]# yum -y install ...
- Counting Pair
Counting Pair Time Limit: 1000 ms Memory Limit: 65535 kB Solved: 112 Tried: 1209 Submit Status Best ...
- 【BZOJ】3495: PA2010 Riddle 2-SAT算法
[题意]有n个城镇被分成了k个郡,有m条连接城镇的无向边.要求给每个郡选择一个城镇作为首都,满足每条边至少有一个端点是首都.n,m,k<=10^6. [算法]2-SAT,前后缀优化建图 [题解] ...
- 【BZOJ】4753: [Jsoi2016]最佳团体 01分数规划+树上背包
[题意]n个人,每个人有价值ai和代价bi和一个依赖对象ri<i,选择 i 时 ri 也必须选择(ri=0时不依赖),求选择k个人使得Σai/Σbi最大.n<=2500,ai,bi< ...
- 【leetcode 简单】第四十九题 颠倒二进制位
颠倒给定的 32 位无符号整数的二进制位. 示例: 输入: 43261596 输出: 964176192 解释: 43261596 的二进制表示形式为 000000101001010000011110 ...
- ES6基础知识汇总
1.如何理解ECMAScript6? ECMAScript是什么,ECMASCript的作用 2.新增let关键字 let的用途 3.关键字const const作用,传址赋值 4.解构赋值 解构赋值 ...
- UIAutomation Diagram