【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 ...
随机推荐
- sql中用逗号拼接字符串
MSSQL中可以用STUFF函数拼接成字符串. 如: SELECT FieldSomeElse, ( SELECT STUFF(( SELECT ',' + LinkField FROM Detail ...
- 如何让2个并列的div根据内容自动保持同等高度
最近在工作中碰到一个需求: 有左右2个并列的div,2个div都不能限定高度.左div为导航,右div为内容.如何能让左div块自动获得和右div块相等的高度? 同时,也有网友提问到"如果右 ...
- jQuer基础
一.概述 jQuery是一个兼容多浏览器的javascript库,核心理念是write less,do more.如今,jQuery已经成为最流行的javascript库,在世界前10000个访问最多 ...
- XML Drawable与9-Patches
可绘制对象资源 两种设计工具均属于drawable.Android把任何可绘制在屏幕上的图形图像都称为drawable drawable可以是一种抽象的图形.一个继承 Drawable 类的子类,或者 ...
- Python 3. 里filter与generator expression的区别
# -*- coding: utf-8 -*- """ A test to show the difference between filter and genrator ...
- Shell脚本编程的常识
(这些往往是经常用到,但是各种网络上的材料都语焉不详的东西,个人认为比较有用) 七种文件类型 d 目录 ...
- 彻底解决iOS项目中 "_OBJC_CLASS_$_XXXService", referenced from: 的相似问题
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbmllcGVuZzEwOQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...
- 这难道是CSDN的BUG? 大家帮忙看看哪里有问题
问题: 有位网友发私信给我,提问关于网络project专业以后这么就业,要掌握哪些技术? 我就给回复, 内容例如以下: 你好,很抱歉这么晚才给你回复.对于网络project专业,就业范围事实上挺广泛的 ...
- 发送email给列表中的邮箱--python
#!/usr/bin/python # -*- coding: utf-8 -*- # from email.Header import Header from email.MIMEText impo ...
- 【转】Android 最火框架XUtils之注解机制详解
原文:http://blog.csdn.net/rain_butterfly/article/details/37931031 在上一篇文章Android 最火的快速开发框架XUtils中简单介绍了x ...