bzoj3529(莫比乌斯反演+离线+树状数组)
在你以为理解mobus的时候,苦苦想通过化简公式来降低复杂度时,这题又打了我一巴掌。
看来我并没有理解到acmicpc比赛的宗旨啊。
这么多次查询可以考虑离线操作,使用树状数组单点更新。
/**************************************************************
Problem: 3529
User: chenhuan001
Language: C++
Result: Accepted
Time:5264 ms
Memory:8412 kb
****************************************************************/ #include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
#define N 100100 long long getpow(int j,int cnt)
{
return (long long)(pow((double)j, cnt+)-)/(j-);
} struct Binary_Index_tree
{
long long a[N+];
void init()
{
memset(a,,sizeof(a));
}
//位运算
int lowbit(int x)
{
return x & (-x);
} //修改x这个点,并把所有包含x点的所有点都进行修改
void modify(int x,int add)
{
if(x==) return ;
while(x<N)
{
a[x]+=add;
x+=lowbit(x);
}
} //得到[1,x]的和
long long get_sum(int x)
{
//if(x >= N) return 0;
long long ret=;
while(x>)
{
ret += a[x];
x-=lowbit(x);
}
return ret;
} }bt; struct Case
{
int id;
int n,m,a;
}tt[]; struct Link
{
int i,x;
}g[N+]; long long ans[]; int casecmp(Case t1,Case t2)
{
return t1.a<t2.a;
} int linksort(Link l1,Link l2)
{
return l1.x<l2.x;
} //--莫比乌斯反演函数--//
//说明:利用线性素数筛选顺便求了个mu
//注释部分为求从区间[1,b]和区间[1,d]中取两个数,互质对数O(n^0.5)
//复杂度:O(n)
int mu[N];
//int sum[N]; void mobus()
{
bool mark[N];
int prime[N];
int pcnt=;
memset(mark,,sizeof(mark));
mu[] = ;
for(int i=;i<N;i++)
{
if(mark[i] == )
{
prime[pcnt++] = i;
mu[i] = -;
}
for(int j=;j<pcnt && i*prime[j]<N;j++)
{
int tmp = i*prime[j];
mark[tmp] = ;
if( i%prime[j] == )
{
mu[tmp] = ;
break;
} mu[tmp] = mu[i]*-;
}
}
// for(int i=1;i<N;i++)
// sum[i] += sum[i-1]+mu[i];
} long long gaobili(int b,int d)
{
if(b<=||d<=) return ;
int m = min(b,d);
long long ans = ;
while(m>=)
{
int tb = b/( b/m + )+;
int td = d/( d/m + )+;
//前进的最大位置
int tm = max(tb,td);
ans += (bt.get_sum(m)-bt.get_sum(tm-))*(b/m)*(d/m);
m = tm-;
}
return ans;
} int main(int argc, const char * argv[]) { for(int i=;i<N;i++)
{
int tmp = ;
int ti = i;
for(int j=;j*j<=ti;j++)
{
if(ti%j == )
{
int cnt=;
while(ti%j==)
{
ti /= j;
cnt++;
}
tmp *= getpow(j,cnt);
}
}
if(ti != )
{
tmp *= getpow(ti,);
}
g[i].i = i; g[i].x = tmp;
}
sort(g+,g+N,linksort); int T;
cin>>T;
for(int i=;i<T;i++)
{
tt[i].id = i;
scanf("%d%d%d",&tt[i].n,&tt[i].m,&tt[i].a);
}
sort(tt,tt+T,casecmp); bt.init();
mobus(); int j=;
for(int i=;i<T;i++)
{
while(j<N && g[j].x <= tt[i].a)
{
int tmp = g[j].i;
for(int d=tmp;d<N;d += tmp)
{
bt.modify(d, g[j].x*mu[d/tmp]);
}
j++;
}
//然后就是根号n
ans[tt[i].id] = gaobili(tt[i].m, tt[i].n);
} //for(int i=0;i<T;i++) cout<<ans[i]%(1LL<<31)<<endl;
long long mod = (1LL<<(31LL));
for(int i=;i<T;i++) printf("%d\n",(int)(ans[i]&(0x7fffffff)));
return ;
}
bzoj3529(莫比乌斯反演+离线+树状数组)的更多相关文章
- 【bzoj3529】[Sdoi2014]数表 莫比乌斯反演+离线+树状数组
题目描述 有一张n×m的数表,其第i行第j列(1 <= i <= n ,1 <= j <= m)的数值为能同时整除i和j的所有自然数之和.给定a,计算数表中不大于a的数之和. ...
- 【BZOJ3529】数表(莫比乌斯反演,树状数组)
[BZOJ3529]数表(莫比乌斯反演,树状数组) 题解 首先不管\(A\)的范围的限制 要求的东西是 \[\sum_{i=1}^n\sum_{j=1}^m\sigma(gcd(i,j))\] 其中\ ...
- 【BZOJ 3529】 [Sdoi2014]数表 (莫比乌斯+分块+离线+树状数组)
3529: [Sdoi2014]数表 Description 有一张N×m的数表,其第i行第j列(1 < =i < =礼,1 < =j < =m)的数值为能同时整除i和j的所有 ...
- BZOJ3529: [Sdoi2014]数表 莫比乌斯反演_树状数组
Code: #include <cstdio> #include <algorithm> #include <cstring> #define ll long lo ...
- POJ 3416 Crossing --离线+树状数组
题意: 给一些平面上的点,然后给一些查询(x,y),即以(x,y)为原点建立坐标系,一个人拿走第I,III象限的点,另一个人拿II,IV象限的,点不会在任何一个查询的坐标轴上,问每次两人的点数差为多少 ...
- HDU 2852 KiKi's K-Number(离线+树状数组)
题目链接 省赛训练赛上一题,貌似不难啊.当初,没做出.离线+树状数组+二分. #include <cstdio> #include <cstring> #include < ...
- CF #365 (Div. 2) D - Mishka and Interesting sum 离线树状数组
题目链接:CF #365 (Div. 2) D - Mishka and Interesting sum 题意:给出n个数和m个询问,(1 ≤ n, m ≤ 1 000 000) ,问在每个区间里所有 ...
- CF #365 (Div. 2) D - Mishka and Interesting sum 离线树状数组(转)
转载自:http://www.cnblogs.com/icode-girl/p/5744409.html 题目链接:CF #365 (Div. 2) D - Mishka and Interestin ...
- HDU3333 Turing Tree 离线树状数组
题意:统计一段区间内不同的数的和 分析:排序查询区间,离线树状数组 #include <cstdio> #include <cmath> #include <cstrin ...
- 离线树状数组 hihocoder 1391 Countries
官方题解: // 离线树状数组 hihocoder 1391 Countries #include <iostream> #include <cstdio> #include ...
随机推荐
- SlickGrid example 3a: 可编辑单元
可编辑单元支持一列展示多个属性域,可以为编辑单元提供验证,并且自定义验证事件. 代码: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 T ...
- 好玩的代码之C++实现CPU满载
#include <windows.h> #include <iostream> #include <cstdlib> using namespace std; D ...
- linux网络基础--学习笔记
- Android中直播视频技术探究之---采集摄像头Camera视频源数据进行推流(采用金山云SDK)
一.前言 在之前已经详细介绍了Android中的一种视频数据源:Camera,不了解的同学可以点击进入:Android中Camera使用详解 ,在这篇文章中我们介绍了如何采集摄像头的每一帧数据,然后进 ...
- Vi/Vim查找替换使用方法
vi/vim 中可以使用 :s 命令来替换字符串.该命令有很多种不同细节使用方法,可以实现复杂的功能,记录几种在此,方便以后查询. :s/vivian/sky/ 替换当前行第一个 vivian 为 s ...
- 表结构导出到excel中
SELECT 表名 = case when a.colorder=1 then d.name else '' end, 表说明 = case when a.colorder=1 then isnull ...
- mysql 修改数据库的列
alter table tableName oldcolumn newcolumn datatype;
- ZOJ 2182 Cable TV Network(无向图点割-最大流)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2182 题意:给出一个无向图,问最少删掉多少个顶点之后图变得不连通 ...
- CodeForces 527B Error Correct System
Error Correct System Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I6 ...
- Cheatsheet: 2015 03.01 ~ 03.31
Web The Architecture of Algolia's Distributed Search Network No promises: asynchronous JavaScript wi ...