【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 ...
随机推荐
- Installing your app on your Windows RT device
Alright… so my app is almost finished and I want to install it for real on my Surface tablet. How do ...
- 第三步 用Jena自定义完成数据库到RDF的映射
第三步 用Jena自定义完成数据库到RDF的映射 2013年10月17日 8:53:27 这一步用Jena编程,终于能做点有技术含量的事情了.这个工作计划本周内完成,下周一好给老师一个交待. 目标:把 ...
- 通过WMI配置IP
$wmi = gwmi win32_networkadapterconfiguration -filter "ipenabled = 'true'"$wmi.EnableStati ...
- 批处理:循环解压不同文件夹下的zip压缩包
结构如下 A文件夹: A1文件.zip A2文件.zip A3文件.zip B文件夹: B1文件.zip B2文件.zip B3文件.zip ...... 批处理文件:rezip.bat如下 @ech ...
- 【Linq递归查找系列】
Linq递归查找: public IEnumerable<MenuInfo> GetTree(int id, IEnumerable<MenuInfo> lst) { var ...
- 如何实现windows和linux之间的文件传输
2010-04-25 18:10 如何实现windows和linux之间的文件传输 如果想从windows中传送大量文件到Linux中,想必会难倒部分Linux初学者,尤其是文件很大时.我曾试过在li ...
- Winform之跨线程访问控件(在进度条上显示字体)
此文章对于遇到必须使用线程但是没有办法在线程内操作控件的问题的处理 有很好的解决方案(个人认为的.有更好的方案欢迎交流.) 在做跨线程访问之前我们先了解下我们所做的需要达到的效果: 这个是批量的将x ...
- EventBus3.0使用总结
在Android中,接口回调已经能够处理掉大部分业务需求了,实在太变态的需求就用广播也能够完成,自己写的性能好出问题也好解决.....工作需要,不得不看看EventBus的用法,今天就来介绍一下学习经 ...
- ArcGIS中文件共享锁定数据溢出 这个方法不行,建议用gdb,不要用mdb
ArcGIS中文件共享锁定数据溢出 (2011-11-24 15:52:41) 转载▼ 标签: 杂谈 分类: GIS 文件共享锁定数溢出.(Error 3052)1. Access数据库,同时操作大量 ...
- tinyxml_settattr
TiXmlString& TiXmlString::assign(const char* str, size_type len) { size_type cap = capacity(); * ...