【BZOJ3529】【莫比乌斯反演 + 树状数组】[Sdoi2014]数表
Description
有一张N×m的数表,其第i行第j列(1 < =i < =礼,1 < =j < =m)的数值为
能同时整除i和j的所有自然数之和。给定a,计算数表中不大于a的数之和。
Input
输入包含多组数据。
输入的第一行一个整数Q表示测试点内的数据组数,接下来Q行,每行三个整数n,m,a(|a| < =10^9)描述一组数据。
Output
对每组数据,输出一行一个整数,表示答案模2^31的值。
Sample Input
4 4 3
10 10 5
Sample Output
148
HINT
1 < =N.m < =10^5 , 1 < =Q < =2×10^4
Source
【分析】
其实是个比较水的题目。
/*
唐代杜牧的《遣怀》
落魄江南载酒行,楚腰纤细掌中轻。
十年一觉扬州梦,赢得青楼薄幸名。
*/
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
#include <iostream>
#include <string>
#include <ctime>
#include <map>
#include <set>
#define LOCAL
long long MOD = + ;
const int MAXM = * + ;
const int MAXN = + ;
using namespace std;
//输入输出优化
int read(){
int x = , flag = ;
char ch = getchar();
while (ch < '' || ch >'') {if (ch == '-') flag = -; ch = getchar();}
while (ch >= '' && ch <= '') {x = x * + (ch - ''); ch = getchar();}
return x * flag;
}
struct FF{
int order;//order表示该num对应的gcd值
int num;
bool operator < (const FF &b)const{
return num < b.num;
}
}F[MAXN];
struct QUERY{
int l, r, a, order;
bool operator < (const QUERY &b)const{
return a < b.a;
}
}q[MAXN];
int mu[MAXN], prime[MAXN];
int g[MAXN], C[MAXN], Q, Ans[MAXN]; int lowbit(int x){return x & -x;}
void add(int x, int val){
while (x <= ){
C[x] += val;
x += lowbit(x);
}
return;
}
int sum(int x){
int cnt = ;
while (x > ){
cnt += C[x];
x -= lowbit(x);
}
return cnt;
}
void prepare(){
memset(prime, , sizeof(prime));
memset(C, , sizeof(C)); mu[] = ;
for (int i = ;i <= ; i++){
if (!prime[i]){
prime[++prime[]] = i;
mu[i] = -;
}
for (int j = ; j <= prime[]; j++){
if (i * prime[j] > ) break;
prime[i * prime[j]] = ;
if (i % prime[j] == ){
mu[i * prime[j]] = ;
break;
}else mu[i * prime[j]] = -mu[i];
}
}
//F[i]代表i的因数和
F[].num = F[].order = ;
for (int i = ; i <= ; i++){
int cnt = ;
for (long long j = ; j * (long long)j <= (long long)i; j++){
if (j * j == i){cnt += j; break;}
if (i % j != ) continue;
cnt += j + (i / j);
}
F[i].num = cnt;
F[i].order = i;
}
sort(F + , F + + );
//for (int i = 1; i <= 100; i++) printf("%d\n", mu[i]);
}
void init(){
scanf("%d", &Q);
for (int i = ; i <= Q; i++){
int l = read(), r = read(), a = read();
q[i].l = l; q[i].r = r;
q[i].a = a; q[i].order = i;
}
sort(q + , q + + Q);
}
//直接回答第x个询问
int query(int x){
int cnt = ;
for (int i = ; i <= min(q[x].l, q[x].r); i++){
int t = min(q[x].l / (q[x].l / i), q[x].r / (q[x].r / i));
cnt += (q[x].l / i) * (q[x].r / i) * (sum(t) - sum(i - ));
i = t;
}
return cnt;
}
void work(){
int pos = ;//表示a现在的大小
for (int i = ; i <= Q; i++){
while (F[pos].num <= q[i].a && pos <= ){
for (int j = ; j * F[pos].order <= ; j++)
add(j * F[pos].order, F[pos].num * mu[j]);
pos++;
}
Ans[q[i].order] = query(i);
}
for (int i = ; i <= Q; i++) printf("%d\n", Ans[i] & 0x7fffffff);
} int main(){
int T; prepare();
init();
work();
return ;
}
【BZOJ3529】【莫比乌斯反演 + 树状数组】[Sdoi2014]数表的更多相关文章
- 【BZOJ3529】[Sdoi2014]数表 莫比乌斯反演+树状数组
[BZOJ3529][Sdoi2014]数表 Description 有一张N×m的数表,其第i行第j列(1 < =i < =礼,1 < =j < =m)的数值为能同时整除i和 ...
- 【BZOJ3529】【SDOI2014】数表 (莫比乌斯反演+树状数组)
传送门 Description 有一张$n\times m$的数表,其第$i$行第$j$列 $(1≤i≤n,1≤j≤m)$ 的数值为能同时整除$i$和$j$的所有自然数之和.现在给定$a$,计算数表中 ...
- BZOJ3529: [Sdoi2014]数表(莫比乌斯反演 树状数组)
题意 题目链接 Sol 首先不考虑\(a\)的限制 我们要求的是 \[\sum_{i = 1}^n \sum_{j = 1}^m \sigma(gcd(i, j))\] 用常规的套路可以化到这个形式 ...
- BZOJ 3259 [Sdoi2014]数表 (莫比乌斯反演 + 树状数组)
3529: [Sdoi2014]数表 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2321 Solved: 1187[Submit][Status ...
- BZOJ 3529: [Sdoi2014]数表 [莫比乌斯反演 树状数组]
3529: [Sdoi2014]数表 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1399 Solved: 694[Submit][Status] ...
- BZOJ 3529 [Sdoi2014]数表 (莫比乌斯反演+树状数组+离线)
题目大意:有一张$n*m$的数表,第$i$行第$j$列的数是同时能整除$i,j$的所有数之和,求数表内所有不大于A的数之和 先是看错题了...接着看对题了发现不会做了...刚了大半个下午无果 看了Po ...
- BZOJ_3529_[Sdoi2014]数表_莫比乌斯反演+树状数组
Description 有一张 n×m 的数表,其第 i 行第 j 列(1 <= i <= n, 1 <= j <= m)的数值为 能同时整除 i 和 j 的所有自然数之和.给 ...
- 洛谷P3312 [SDOI2014]数表(莫比乌斯反演+树状数组)
传送门 不考虑$a$的影响 设$f(i)$为$i$的约数和 $$ans=\sum\limits_{i=1}^n\sum\limits_{j=1}^nf(gcd(i,j))$$ $$=\sum\limi ...
- BZOJ 3529 [Sdoi2014]数表 ——莫比乌斯反演 树状数组
$ans=\sum_{i=1}^n\sum_{j=1}^n\sigma(gcd(i,j))$ 枚举gcd为d的所有数得到 $ans=\sum_{d<=n}\sigma(d)*g(d)$ $g(d ...
随机推荐
- 算法导论学习-prim算法
一. 关于最小生成树 对于无向连通图G=(V,E),其中V表示图的顶点,E表示图的边,对于每条边都有一个权值,可以理解为边a->b的权值C为从a走到b要走的路程为C.现在我们希望找到一个无回路的 ...
- Codeforces182D - Common Divisors(KMP)
题目大意 如果把字符串a重复m次可以得到字符串b,那么我们称字符串a为字符串b的一个因子,现在给定两个字符串S1和S2,求它们的公共因子个数 题解 如果它们有公共因子,那么显然它们的最小公共因子肯定是 ...
- Oracle- 初识
我一直没用过ORACLE.今天总算装上了,说一下我装的过程,感觉还是有点折腾的. 一.我装的是ORACLE 9版本,从网上下载的总大小1.3G.是三个压缩包. 首先我解压三个压缩包后,使用UltraI ...
- hdu4486 Pen Counts(水题)
Pen Counts Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- js中对arry数组的各种操作小结
最近工作比较轻松,于是就花时间从头到尾的对js进行了详细的学习和复习,在看书的过程中,发现自己平时在做项目的过程中有很多地方想得不过全面,写的不够合理,所以说啊,为了在以后的工作中写出最优化的代码,我 ...
- java中double四舍五入并设置小数点位数的问题
本文系转载,原文地址:http://blog.csdn.net/star_huang/article/details/7639267 今天遇到个需要将一个double类型的数据保留小数点后两位的问题. ...
- ASP.NET 开发人员应该知道的8个网站
1.CodeProject http://www.codeproject.com/ 2.DotNetNuke 3.4GuysFromRolla 4.DevSource 5.DevX http://ww ...
- Demo1_iOS9网络适配_改用更安全的HTTPS
iOS9把所有的http请求都改为https了:iOS9系统发送的网络请求将统一 使用TLS 1.2 SSL.采用TLS 1.2 协议,目的是 强制增强数据访问安全,而且 系统 Foundation ...
- Oracle常用查询命令
Oracle查询完整格式如下: Select * from XX where XX group by YY having XX order by YY Select count(*), XX fr ...
- 【转】Android 应用测试总结
前提所有的功能分支已完成 启动:1. 启动入口:桌面正常启动,最近运行启动,所有程序列表中启动,锁屏快捷启动2. 其他入口:从其他程序开启应用,从外部以文件形式打开应用(如果有)3. 退回:从其他程序 ...