51nod 1586 约数和
来源:互联网 发布:浙大网新恒天软件福利 编辑:程序博客网 时间:2024/06/08 02:40
可以通过b数组来找到a数组和c数组的关系。假设现在更新a[x],求c[y],只要找到一个a[x]对c[y]贡献了多少次即可。b对c产生直接的贡献。则c[y]来自b的贡献就是y的因子的个数,在y的这些因子中,如果他是x的倍数,则有一次a[x]的贡献,则y的因子中有多少因子是x的倍数,a[x]就对c[y]贡献了多少次,y的因子中有y/x个数是x的倍数,所以a[x]对c[y]贡献了y/x次。约数的个数是sqrt(n)级别的,就暴力枚举就好了。
参考:http://blog.csdn.net/pure_w/article/details/51703311
#include <bits/stdc++.h>using namespace std;const int MAXN = 1e6+10;int f[MAXN];int n,q;long long c[MAXN];template <class T>inline bool scan_d(T &ret){ char c; int sgn; if(c=getchar(),c==EOF) return 0; //EOF while(c!='-'&&(c<'0'||c>'9')) c=getchar(); sgn=(c=='-')?-1:1; ret=(c=='-')?0:(c-'0'); while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0'); ret*=sgn; return 1;}inline void out(long long x){ if(x>9) out(x/10); putchar(x%10+'0');}void init(){ for(int i = 1; i <= n; ++i) for(int j = i; j <= n; j += i) f[j]++;}int main(){ scan_d(n); scan_d(q); init(); int op,x,y; while(q--) { scan_d(op); if(op == 1) { scan_d(x); scan_d(y); for(int i = x, j = 1; i <= n; i += x,++j) c[i] += y*f[j]; } else { scan_d(x); out(c[x]); puts(""); } } return 0;}
阅读全文
0 0
- 51nod 1586 约数和
- 51nod 1586 约数和
- 51Nod 1586 约数和
- 51Nod-1586-约数和
- 51nod 1586 约数和
- [杜教筛 约数和前缀和] 51Nod 1220 约数之和
- 【51nod】【算法马拉松14】1586 约数和
- 51nod 1584 加权约数和
- 51nod 1584 加权约数和
- 51Nod-1220-约数之和
- 51nod 1220 约数之和
- 51nod 1220 约数之和
- [莫比乌斯反演] 51Nod 1584 加权约数和
- 51nod1584 加权约数和
- 约数个数及约数和
- PE 439 Sum of sum of divisors | 51nod 1220 约数之和
- 51nod oj 1116 【进制问题】 1179【约数打表】
- 51nod 1165 整边直角三角形的数量 【数学:公式--求约数】
- 关闭wi8.1系统安全软件
- Linux 习题3
- flume架构图
- JDBC连接和DBUtils的使用详解
- Java算法——判断一个数是否是回文数
- 51nod 1586 约数和
- 【数据结构】顺序存储——定义
- 第六周LeetCode
- 【小项目】Spring boot基于Redis缓存商城分类,商品信息(含源码下载)
- Executing an update/delete query(未开启事务)
- Educational Codeforces Round 30
- 去除数组重复元素的四种方法
- 各个模型特征总结学习
- js笔记—— 基础部分一