loj#6229 这是一道简单的数学题
\(\color{#0066ff}{ 题目描述 }\)
这是一道非常简单的数学题。
最近 LzyRapxLzyRapx 正在看 mathematics for computer science 这本书,在看到数论那一章的时候, LzyRapxLzyRapx 突然想到这样一个问题。
设
\]
其中,\(\mathrm{lcm}(a,b)\) 表示 \(a\) 和 \(b\) 的最小公倍数,\(\mathrm{gcd}(a,b)\) 表示 \(a\) 和 \(b\) 的最大公约数。
给定 \(n\) ,让你求: \(F(n) \bmod1000000007\)。
\(L\) 同学太菜啦,QAQ,并不会做这道简单题,所以他想请你帮他解决这个问题。
\(\color{#0066ff}{输入格式}\)
输入一行,一个正整数 \(n\,(1 \le n \le 10^9)\)。
\(\color{#0066ff}{输出格式}\)
输出 \(F(n)\) ,对 \(10^9 + 7\) 取模。
\(\color{#0066ff}{输入样例}\)
5
\(\color{#0066ff}{输出样例}\)
84
\(\color{#0066ff}{数据范围与提示}\)
对于所有数据,\(1 \le n \le 10^9\)。
\(\color{#0066ff}{ 题解 }\)
开始推式子
题目要求
\]
可以考虑求
\]
然后发现我们要求的答案是下图S1+S3,上面的式子是整个正方形
于是答案可以等于(正方形+对角线)的一半
所以问题转为了下面的式子,顺便改写为gcd形式
\]
于是,枚举gcd
\]
后面把d弄出来
\]
利用\(\mu * i = e\)套进去
\]
即
\]
改为枚举倍数
\]
然后pd换q的套路
\]
\]
我们现在要求的\(h=f*g\)这样才能杜教筛
考虑将f拆开,可以发现\(f=t*1\)
于是\(h=t*1*g=t*g*1\)
然后可以神奇的发现
\]
然后。。。
\]
额,\(h(n)=1\)
不过杜教筛的前半部分是要线性筛的,这东西咋弄啊?
可以发现,\(\mu(d)*d^2\) 是一个积性函数*完全积性函数
所以\(\mu(d)*d^2\)肯定是记性函数
而f是这东西卷上一个1,所以肯定是积性函数,随便筛就行了qwq
#include<bits/stdc++.h>
#define LL long long
LL in() {
char ch; LL x = 0, f = 1;
while(!isdigit(ch = getchar()))(ch == '-') && (f = -f);
for(x = ch ^ 48; isdigit(ch = getchar()); x = (x << 1) + (x << 3) + (ch ^ 48));
return x * f;
}
const int mod = 1e9 + 7;
const int maxn = 4e6 + 10;
std::map<int, LL> mp;
LL pri[maxn], mu[maxn], tot, six;
bool vis[maxn];
LL ksm(LL x, LL y) {
LL re = 1LL;
while(y) {
if(y & 1) re = re * x % mod;
x = x * x % mod;
y >>= 1;
}
return re;
}
void predoit() {
six = ksm(6, mod - 2);
mu[1] = 1;
vis[1] = true;
for(LL i = 2; i < maxn; i++) {
if(!vis[i]) pri[++tot] = i, mu[i] = 1 - (LL)i * i;
for(int j = 1; j <= tot && (LL)i * pri[j] < maxn; j++) {
vis[i * pri[j]] = true;
if(i % pri[j] == 0) {
mu[i * pri[j]] = mu[i];
break;
}
else mu[i * pri[j]] = mu[i] * mu[pri[j]];
}
}
for(int i = 2; i < maxn; i++) mu[i] = (mu[i] + mu[i - 1]) % mod;
}
LL gettot(LL x) {
x %= mod;
LL ans = (x * (x + 1) >> 1) % mod;
return ans * ans % mod;
}
LL getpfh(LL x) {
x %= mod;
LL ans = x;
ans = (ans * (x + 1)) % mod;
ans = (ans * ((x << 1LL) + 1)) % mod;
return ans * six % mod;
}
LL getmu(LL n) {
if(n < maxn) return mu[n];
if(mp.count(n)) return mp[n];
LL ans = n;
for(LL l = 2, r; l <= n; l = r + 1) {
r = n / (n / l);
LL tot1 = ((getpfh(r) - getpfh(l - 1)) % mod + mod) % mod;
tot1 = (tot1 * getmu(n / l)) % mod;
ans = ((ans - tot1) % mod + mod) % mod;
}
return mp[n] = ans;
}
LL work(LL n) {
LL ans = 0;
for(LL l = 1, r; l <= n; l = r + 1) {
r = n / (n / l);
LL tot1 = ((getmu(r) - getmu(l - 1)) % mod + mod) % mod;
tot1 = tot1 * gettot(n / l) % mod;
ans = (ans + tot1) % mod;
}
return ((ans + n) % mod) * ksm(2, mod - 2) % mod;
}
int main() {
predoit();
printf("%lld\n", work(in()));
return 0;
}
loj#6229 这是一道简单的数学题的更多相关文章
- loj#6229. 这是一道简单的数学题 (??反演+杜教筛)
题目链接 题意:给定\(n\le 10^9\),求:\(F(n)=\sum_{i=1}^n\sum_{j=1}^i\frac{\mathrm{lcm}(i,j)}{\mathrm{gcd}(i,j)} ...
- LOJ#6229. 这是一道简单的数学题(莫比乌斯反演+杜教筛)
题目链接 \(Description\) 求\[\sum_{i=1}^n\sum_{j=1}^i\frac{lcm(i,j)}{gcd(i,j)}\] 答案对\(10^9+7\)取模. \(n< ...
- loj6229 这是一道简单的数学题
https://loj.ac/problem/6229 题解:https://blog.csdn.net/Vectorxj/article/details/79094659 套路推式子,杜教筛,证明复 ...
- 【acmm】一道简单的数学题
emm卡常 我本来写成了这个样子: #include<bits/stdc++.h> using namespace std; typedef long long LL; ; struct ...
- 【学术篇】luogu3768 简单的数学题(纯口胡无代码)
真是一道"简单"的数学题呢~ 反演题, 化式子. \[ ans=\sum_{i=1}^n\sum_{j=1}^nijgcd(i,j) \\ =\sum_{i=1}^n\sum_{j ...
- NYOJ 330 一个简单的数学题【数学题】
/* 题目大意:求解1/n; 解题思路:写一个输出小数的算法 关键点:怎样处理小数点循环输出 解题人:lingnichong 解题时间:2014-10-18 09:04:22 解题体会:输出小数的算法 ...
- 又一道简单题&&Ladygod(两道思维水题)
Ladygod Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit S ...
- 【数学】HPU--1037 一个简单的数学题
1037: 一个简单的数学题 [数学] 时间限制: 1 Sec 内存限制: 128 MB提交: 259 解决: 41 统计 题目描述 小明想要知道$a^b$的值,但是这个值会非常的大. 所以退而求其次 ...
- 【Luogu3768】简单的数学题(莫比乌斯反演,杜教筛)
[Luogu3768]简单的数学题(莫比乌斯反演,杜教筛) 题面 洛谷 \[求\sum_{i=1}^n\sum_{j=1}^nijgcd(i,j)\] $ n<=10^9$ 题解 很明显的把\( ...
随机推荐
- AngularJS:实例
ylbtech-AngularJS:实例 1.返回顶部 1. AngularJS 实例 实例 您可以在线编辑实例,然后点击按钮查看结果. AngularJS 实例 <div ng-app=&qu ...
- AngularJS:输入验证
ylbtech-AngularJS:输入验证 1.返回顶部 1. AngularJS 输入验证 AngularJS 表单和控件可以验证输入的数据. 输入验证 在前面的几个章节中,你已经学到关于 Ang ...
- cpu上下文切换(下)
--怎么查看系统的上下文切换情况 过多的上下文切换,会把cpu时间消耗在寄存器.内核栈以及虚拟内存等数据的保存和恢复上,缩短进程真正运行的时间,成了系统性能大幅下降的一个元凶. 查看,使用vmstat ...
- mongodb collection method
https://docs.mongodb.com/manual/reference/method/db.collection.bulkWrite/ db.coll_test.getIndexes()# ...
- MySQL 学习四 SQL优化
MySQL逻辑架构: 第一层:客户端层,连接处理,授权认证,安全等功能. 第二层:核心层,查询解析,分析,优化,缓存,内置函数(时间,数学,加密),存储过程,触发器,视图 第三层:存储引擎.负 ...
- Jlink flash 烧录HEX 程序
一般Jlink版本 和 Jag(硬件)最好匹配 安装Jlink 时,IAR的工具包也可以顺带安装. 有源码: IAR 可以自动选择CPU型号,代码直接Download and debug https: ...
- python中匹配中文,解决不匹配,乱码等问题
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe7 in position 0: ordinal 字符串前加 ur‘str’即可;
- leetcode241
public class Solution { public IList<int> DiffWaysToCompute(string input) { List<int> re ...
- 【转】Android下面打印进程函数调用堆栈(dump backtrace)的方法
1. 为什么要打印函数调用堆栈? 打印调用堆栈可以直接把问题发生时的函数调用关系打出来,非常有利于理解函数调用关系.比如函数A可能被B/C/D调用,如果只看代码,B/C/D谁调用A都有可能,如果打印出 ...
- PL/SQL批处理语句(一)BULK COLLECT
我们知道PL/SQL程序中运行SQL语句是存在开销的,因为SQL语句是要提交给SQL引擎处理,这种在PL/SQL引擎和SQL引擎之间的控制转移叫做上下文却换,每次却换时,都有额外的开销.然而,FORA ...