https://www.51nod.com/Challenge/Problem.html#problemId=1586

一眼看过去居然一点思路都没有的,一言不合就打表,打贡献表。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll; int n = 25;
int a[200]; void update_b(int id) {
for(int i = 1; i <= id; ++i) {
if(id % i == 0) {
a[i]++;
}
}
} void show_c(int id) {
memset(a, 0, sizeof(a));
for(int i = 1; i <= id; ++i) {
if(id % i == 0) {
update_b(i);
}
}
printf("c[%d]=\n ", id);
for(int i = 1; i <= n; ++i) {
printf("%d%c", a[i], " \n"[i == n]);
}
} int main() {
#ifdef Yinku
freopen("Yinku.in", "r", stdin);
#endif // Yinku
for(int i = 1; i <= n; ++i) {
show_c(i);
}
return 0;
}

好像a[i]位置对c[j]的贡献就是d(j/i)的样子,所以就预处理出d表就完事了?

数字不大,d表有nlogn的出法。但是暴力分解因子果断T,预处理所有数的因子也是T。原因在于因子是根号级别的,但是正解是直接更新a的倍数,是log级别的。

考虑a本身,它对应的另一个因子是1,2a对应的因子是2……这样可以用一个循环直接更新。期望复杂度是O(nlogn)的,而分解质因子暴力的期望复杂度则是O(n*n^{3/4})。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll; const int MAXN = 1e6; int d[MAXN + 5], a[MAXN + 5];
int p[MAXN + 5], ptop;
bool np[MAXN + 5]; void sieve(int n = MAXN) {
np[1] = d[1] = 1;
for(int i = 2; i <= n; ++i) {
if(!np[i])
p[++ptop] = i, d[i] = 2, a[i] = 1;
for(int j = 1, t; j <= ptop && (t = i * p[j]) <= n; ++j) {
np[t] = 1;
if(i % p[j])
d[t] = d[i] * d[p[j]], a[t] = 1;
else {
d[t] = d[i] / (a[i] + 1) * (a[i] + 2);
a[t] = a[i] + 1;
break;
}
}
}
}
const int BufferSize = 1 << 16;
char buffer[BufferSize], *head, *tail;
inline char Getchar() {
if(head == tail) {
int l = fread(buffer, 1, BufferSize, stdin);
tail = (head = buffer) + l;
}
return *head++;
} inline int read() {
int x = 0;
char c = Getchar();
for(; c < '0' || c > '9'; c = Getchar())
;
for(; c >= '0' && c <= '9'; c = Getchar())
x = (x << 3) + (x << 1) + c - '0';
return x ;
}
inline void _write(ll x) {
if(x > 9)
_write(x / 10);
putchar(x % 10 + '0');
}
inline void write(ll x) {
_write(x);
putchar('\n');
} ll c[MAXN + 5] = {};
int main() {
#ifdef Yinku
freopen("Yinku.in", "r", stdin);
#endif // Yinku
sieve();
int n = read(), q = read();
for(int i = 1; i <= q; ++i) {
int op = read();
if(op == 1) {
int x = read();
int y = read();
for(int j = x, k = 1; j <= n; j += x, ++k)
c[j] += (ll)d[k] * y;
} else {
int x = read();
write(c[x]);
}
}
return 0;
}

文件快读是真的快啊。

51nod - 1586 - 约数和 - 打表 - 思维的更多相关文章

  1. [多校联考2019(Round 4 T2)][51nod 1288]汽油补给(ST表+单调栈)

    [51nod 1288]汽油补给(ST表+单调栈) 题面 有(N+1)个城市,0是起点N是终点,开车从0 -> 1 - > 2...... -> N,车每走1个单位距离消耗1个单位的 ...

  2. 51NOD 1220 约数之和 [杜教筛]

    1220 约数之和 题意:求\(\sum_{i=1}^n \sum_{j=1}^n \sigma_1(ij)​\) \[ \sigma_0(ij) = \sum_{x\mid i}\sum_{y\mi ...

  3. Codeforces 914 C 数位DP+暴力打表+思维

    题意 给出一个二进制数\(n\),每次操作可以将一个整数\(x\)简化为\(x\)的二进制表示中\(1\)的个数,如果一个数简化为\(1\)所需的最小次数为\(k\),将这个数叫做特殊的数, 问从\( ...

  4. 51nod 1218 最长递增子序列 | 思维题

    51nod 1218 最长递增子序列 题面 给出一个序列,求哪些元素可能在某条最长上升子序列中,哪些元素一定在所有最长上升子序列中. 题解 YJY大嫂教导我们,如果以一个元素结尾的LIS长度 + 以它 ...

  5. [51Nod 1220] - 约数之和 (杜教筛)

    题面 令d(n)d(n)d(n)表示nnn的约数之和求 ∑i=1n∑j=1nd(ij)\large\sum_{i=1}^n\sum_{j=1}^nd(ij)i=1∑n​j=1∑n​d(ij) 题目分析 ...

  6. 51nod 1674 区间的价值V2(思维+拆位+尺取法)

    最近被四区题暴虐... 题意:lyk拥有一个区间. 它规定一个区间的价值为这个区间中所有数and起来的值与这个区间所有数or起来的值的乘积. 例如3个数2,3,6.它们and起来的值为2,or起来的值 ...

  7. 51Nod 1305 Pairwise Sum and Divide | 思维 数学

    Output 输出fun(A)的计算结果. Input示例 3 1 4 1 Output示例 4 first try: #include "bits/stdc++.h" using ...

  8. 51nod 1220 约数之和【莫比乌斯反演+杜教筛】

    首先由这样一个式子:\( d(ij)=\sum_{p|i}\sum_{q|j}[gcd(p,q)==1]\frac{pj}{q} \)大概感性证明一下吧我不会证 然后开始推: \[ \sum_{i=1 ...

  9. 51nod1586 约数和

    果然我自己写的读入优化naive!...换题目给的读入优化就A了...话说用visual交快了好多啊... const int BufferSize=1<<16; char buffer[ ...

随机推荐

  1. 第七周作业—N42-虚怀若谷

    一.简述OSI七层模型和TCP/IP五层模型 1. OSI七层模型 物理层:二进制传输,为启动.维护以及关闭物理链路定义了电气规范.机械规范.过程规范和功能规范:实际的最终信号的传输是通过物理层实现的 ...

  2. Day_03-函数和模块的使用

    使用函数求阶乘 使用while循环的代码: m = float(input('m = ')) n = float(input('n = ')) mn = m - n fm = 1 while m != ...

  3. 电脑新安装JDK版本并运行使用该JDK版本问题

    情景:电脑上已正常安装一个jdk版本,如:1.7.0_71,因考虑到一些情况,现需要使用版本为1.7.0_80(1.8),故需新安装JDK,并使服务可以运行使用新安装的JDK版本. 网络找寻方法: ( ...

  4. opencv_python_基本图像处理

    https://www.e-learn.cn/content/python/2694135 https://blog.csdn.net/Eastmount/article/details/817488 ...

  5. Amaze ui tree 刷新数据

    最近在做代码生成器,界面用的是Amaze ui ,但是在用tree的时候发现数据绑定不会自动更新,去百度.谷歌查也没有查到,没办法只能自己做一个demo 在这贴上效果图 demo 下载地址https: ...

  6. Oracle传输数据到Sqlserver

    通过Sqlserver的SSIS工具实现数据传输

  7. npm install 成功安装依赖后,运行跑不起来怎么办?

    最近接手公司的项目,由于代码历史悠久,据说已经最少经历过了6个人的手,查看gitee提交的年限,竟然是1-2年前的代码,好吧.这个锅总得有人接,既然是架构师,就要勇于面对挑战,今天把我解决的方法记录起 ...

  8. uva live 7638 Number of Connected Components (并查集)

    题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...

  9. Java的参数传递是值传递?

    引用传递和值传递的区别.(不先说定义的都是在耍流氓!) 按值调用(call by value) : 在参数传递过程中,形参和实参占用了两个完全不同的内存空间.形参所存储的内容是实参存储内容的一份拷贝. ...

  10. selinux的设置包括两个部分: 修改安全上下文和修改策略

    selinux的设置包括两个部分: 修改安全上下文和修改策略 修改安全上下文: chcon = change context: chcon 修改策略: setsebool 策略就是由很多boo类型的变 ...