luogu 3708 koishi的数学题 递推 线性筛
题目链接
题意
输入一个整数\(n\)\((n\leq 1e6)\),设\(f(x)=\sum_{i=1}^n x\mod i\),你需要输出\(f(1),f(2)...,f(n)\).
输入输出格式
输入格式:
一个正整数n。
输出格式:
一行用空格分隔的n个整数\(f(1),f(2)...f(n)\).
输入输出样例
输入样例#1:
10
输出样例#1:
9 16 22 25 29 27 29 24 21 13
思路
列表
\i 1 2 3 4 5 6 7 8 9 10
x mod i\
x\
1 0 1 1 1 1 1 1 1 1 1
2 0 0 2 2 2 2 2 2 2 2
3 0 1 0 3 3 3 3 3 3 3
4 0 0 1 0 4 4 4 4 4 4
5 0 1 2 1 0 5 5 5 5 5
6 0 0 0 2 1 0 6 6 6 6
7 0 1 1 3 2 1 0 7 7 7
8 0 0 2 0 3 2 1 0 8 8
9 0 1 0 1 4 3 2 1 0 9
10 0 0 1 2 0 4 3 2 1 0
递推
在已经算出了\(f(x)\)的基础上,怎么得到\(f(x+1)\)呢?
因为$$(x+1)\mod i = ((x\mod i)+1)\mod i=
\begin{eqnarray}
\begin{cases}
(x\mod i)+1,&i\nmid (x+1)\cr
0, &i\mid (x+1)
\end{cases}
\end{eqnarray}$$
所以\(f(x+1)=f(x)+n-1-g(x+1)\),\(n-1\)的含义为下一行比上一行每个多\(1\),\(g(x+1)\)的含义为贡献本该算作\(0\)却算作了\(i\)因而多加了的部分,即\(\sum_{i\mid (x+1)}i\).
\(i=1\)的时候特殊处理一下。
线性筛
线性筛求一下约数和即可解决。
此处具体讲解可参见 积性函数的性质及证明 + 线性筛 ——Wubaizhe
Code
#include <bits/stdc++.h>
#define maxn 1000010
using namespace std;
typedef long long LL;
int prime[maxn], mx[maxn], sum[maxn], n, tot;
LL d[maxn], ans[maxn];
bool vis[maxn];
void init() {
d[1] = 0;
for (int i = 2; i <= n; ++i) {
if (!vis[i]) {
prime[tot++] = i;
d[i] = sum[i] = i+1;
mx[i] = i;
}
for (int j = 0; j < tot; ++j) {
if (prime[j] * i > n) break;
vis[prime[j] * i] = true;
if (i % prime[j] == 0) {
mx[i * prime[j]] = mx[i] * prime[j];
sum[i * prime[j]] = sum[i] + mx[i * prime[j]];
d[i * prime[j]] = d[i] / sum[i] * sum[i * prime[j]];
break;
}
mx[i * prime[j]] = prime[j];
sum[i * prime[j]] = prime[j] + 1;
d[i * prime[j]] = d[i] * d[prime[j]];
}
}
for (int i = 2; i <= n; ++i) --d[i];
}
int main() {
scanf("%d", &n);
init();
ans[1] = n-1; printf("%lld", ans[1]);
for (int i = 2; i <= n; ++i) {
ans[i] = ans[i-1] + n-1 - d[i];
printf(" %lld", ans[i]);
}
printf("\n");
return 0;
}
luogu 3708 koishi的数学题 递推 线性筛的更多相关文章
- CJOJ 2255 【NOIP2016】组合数问题 / Luogu 2822 组合数问题 (递推)
CJOJ 2255 [NOIP2016]组合数问题 / Luogu 2822 组合数问题 (递推) Description 组合数\[C^m_n\]表示的是从n个物品中选出m个物品的方案数.举个例子, ...
- Luogu P2327 [SCOI2005]扫雷【递推/数学】By cellur925
题目传送门 推了好久啊.看来以后要多玩扫雷了qwq. 其实本题只有三种答案:0.1.2. 对于所有第一列,只要第一个数和第二个数确定后,其实整个数列就确定了,我们可以通过这个递推式得出 sec[i-] ...
- * SPOJ PGCD Primes in GCD Table (需要自己推线性筛函数,好题)
题目大意: 给定n,m,求有多少组(a,b) 0<a<=n , 0<b<=m , 使得gcd(a,b)= p , p是一个素数 这里本来利用枚举一个个素数,然后利用莫比乌斯反演 ...
- LUOGU P3708 koishi的数学题
传送门 解题思路 发现当x+1时,有的x%i会+1,有的会变成0,而变成0的说明是x的约数,就可以nlogn预处理出每个约数的贡献,然后每次用n-约数. 代码 #include<iostream ...
- [模板] 积性函数 && 线性筛
积性函数 数论函数指的是定义在正整数集上的实或复函数. 积性函数指的是当 \((a,b)=1\) 时, 满足 \(f(a*b)=f(a)*f(b)\) 的数论函数. 完全积性函数指的是在任何情况下, ...
- [NOI2017]泳池——概率DP+线性递推
[NOI2017]泳池 实在没有思路啊~~~ luogu题解 1.差分,转化成至多k的概率减去至多k-1的概率.这样就不用记录“有没有出现k”这个信息了 2.n是1e9,感觉要递推然后利用数列的加速技 ...
- CH定理与线性递推
才发觉自己数学差的要死,而且脑子有点浑浑噩噩的,学了一个晚上才学会 如果说的有什么不对的可以在下面嘲讽曲明 以下无特殊说明时,默认方阵定义在实数域上,用\(|A|\)表示\(A\)的行列式 特征值与特 ...
- luogu题解 P1707 【刷题比赛】矩阵加速递推
题目链接: https://www.luogu.org/problemnew/show/P1707 分析: 洛谷的一道原创题,对于练习矩阵加速递推非常不错. 首先我们看一下递推式: \(a[k+2]= ...
- 求解线性递推方程第n项的一般方法
概述 系数为常数,递推项系数均为一次的,形如下面形式的递推式,称为线性递推方程. \[f[n]=\begin{cases} C &n\in Value\\ a_1 f[n-1]+a_2 f[n ...
随机推荐
- cocos2dx for android 接入 fmod的过程
cocos2dx自带的音效播放有SimpleAudioEngine和AudioEngine两个,SimpleAudioEngine可以播放简单的音效, 如果播放音效数量过多的话,多导致有些音效播放失败 ...
- 解决cocos游戏安卓release版本闪退问题
在cocos中偶尔会遇到闪退的问题,特别是android和ios系统下的闪退就特别难处理了, 虽然说能使用xcode和eclipse显示log,但是也会出现一些特别的情况,直接闪退而且 没有任何预兆. ...
- presenting view controller
Present ViewController详解 Present ViewController Modally 一.主要用途 弹出模态ViewController是IOS变成中很有用的一个技术,UIK ...
- A. Vitya in the Countryside
A. Vitya in the Countryside time limit per test 1 second memory limit per test 256 megabytes input s ...
- java中的jdbc操作
package demo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedSta ...
- navicat12.0.24破解方法,简单易操作,亲测可行
navicat12.0.24 32bit 链接:https://pan.baidu.com/s/1dakPje0AzwE86p6ZRHfnsQ 密码:f1ve 破解文件 链接:https://pan. ...
- 安装openstack同步数据库时出错解决方法
错误提示:(2003, "Can't connect to MySQL server on 'controller' ([Errno -2] Name or service not know ...
- 03009_HttpServletResponse
1.HttpServletResponse概述 (1)我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和 ...
- spark作业
假定用户有某个周末网民网购停留时间的日志文本,基于某些业务要求,要求开发 Spark应用程序实现如下功能: 1.实时统计连续网购时间超过半个小时的女性网民信息. 2.周末两天的日志文件第一列为姓名,第 ...
- list里内置程序用法
列表是我们编程工作中经常都会遇到的数据类型.以下是列表里面的一些常用操作,主要分为:增! 删! 改! 查! first 查: 1.索引(下标),其中有切片操作,但要注意下标都是从零开始: 2.查元素出 ...