【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 ...
随机推荐
- oralce health monitor
1. Health Monitor简介 Health Monitor是11g里新增加的特性,用于数据库的各层和各个组建的诊断检查.例如可以检查:文件损坏.物理逻辑块损坏.redo和undo故障. ...
- php数组相加 两个数组键名相同 后者不能覆盖前者
array(“a”)+array(“b”)结果还是array(“a”) array(“a”)+array(“b”)的结果是 array(“a”) 因为,它们等效于array(“0″=>”a”)+ ...
- 使用Mybatis-Generator自动生成Dao、Model、Mapping相关文件
最近一直在学习SSM框架,今天遇到一个关于MyBatis生成的问题,记录一下. http://blog.csdn.net/zhshulin/article/details/37956105 我是根据这 ...
- spring boot配置写法
转自:http://blog.csdn.net/mickjoust/article/details/51646658 每日金句 你要搞清楚自己人生的剧本:不是你父母的续集,不是你子女的前传,更不是你朋 ...
- Shiro 源码分析
http://my.oschina.net/huangyong/blog/215153 Shiro 是一个非常优秀的开源项目,源码非常值得学习与研究. 我想尝试做一次 不一样 的源码分析:源码分析不再 ...
- sdk 命令行
1.关闭服务命令:adb kill-server 2. 启动服务命令:adb start-server 3.查询当前设备命令:adb devices 4.安装应用程序命令:adb install [a ...
- Activity 的启动模式
好久没用过那几种activity的启动模式了,如今看到singletop竟然傻了眼,完全忘记了这几种启动模式的区别!隧将两年前的总结翻出来,通读一遍那晦涩难懂的记录,又理解了一遍,在以前记录的基础上, ...
- navicate恢复数据
恢复psc文件,出现记录数为0 不要使用事务,选用遇到错误继续
- WINFORM跟随WPF窗体移动
<Window x:Name="mainWindow1" x:Class="WpfApplication9.MainWindow" xml ...
- java.lang.ClassNotFoundException: Didn't find class "*****Activity" on path: /data/app/*******.apk
http://blog.csdn.net/lovexieyuan520/article/details/9032797/ 很多人出现了java.lang.RuntimeException: Unabl ...