在你以为理解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(莫比乌斯反演+离线+树状数组)的更多相关文章

  1. 【bzoj3529】[Sdoi2014]数表 莫比乌斯反演+离线+树状数组

    题目描述 有一张n×m的数表,其第i行第j列(1 <= i <= n ,1 <= j <= m)的数值为能同时整除i和j的所有自然数之和.给定a,计算数表中不大于a的数之和. ...

  2. 【BZOJ3529】数表(莫比乌斯反演,树状数组)

    [BZOJ3529]数表(莫比乌斯反演,树状数组) 题解 首先不管\(A\)的范围的限制 要求的东西是 \[\sum_{i=1}^n\sum_{j=1}^m\sigma(gcd(i,j))\] 其中\ ...

  3. 【BZOJ 3529】 [Sdoi2014]数表 (莫比乌斯+分块+离线+树状数组)

    3529: [Sdoi2014]数表 Description 有一张N×m的数表,其第i行第j列(1 < =i < =礼,1 < =j < =m)的数值为能同时整除i和j的所有 ...

  4. BZOJ3529: [Sdoi2014]数表 莫比乌斯反演_树状数组

    Code: #include <cstdio> #include <algorithm> #include <cstring> #define ll long lo ...

  5. POJ 3416 Crossing --离线+树状数组

    题意: 给一些平面上的点,然后给一些查询(x,y),即以(x,y)为原点建立坐标系,一个人拿走第I,III象限的点,另一个人拿II,IV象限的,点不会在任何一个查询的坐标轴上,问每次两人的点数差为多少 ...

  6. HDU 2852 KiKi's K-Number(离线+树状数组)

    题目链接 省赛训练赛上一题,貌似不难啊.当初,没做出.离线+树状数组+二分. #include <cstdio> #include <cstring> #include < ...

  7. 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) ,问在每个区间里所有 ...

  8. 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 ...

  9. HDU3333 Turing Tree 离线树状数组

    题意:统计一段区间内不同的数的和 分析:排序查询区间,离线树状数组 #include <cstdio> #include <cmath> #include <cstrin ...

  10. 离线树状数组 hihocoder 1391 Countries

    官方题解: // 离线树状数组 hihocoder 1391 Countries #include <iostream> #include <cstdio> #include ...

随机推荐

  1. preparedStatement和Statement 有什么不一样

    1. PreparedStatement接口继承Statement, PreparedStatement 实例包含已编译的 SQL 语句,所以其执行速度要快于 Statement 对象.    2.作 ...

  2. poj3667 Hotel

    此题不难却易出错,很能考察思维的严谨性. 指定ll为区间内左端顶格数的连续可利用房间,rr为右端顶格数的数值,mm为区间内最长的连续可利用房间数. 在查询的时候,由于要返回最靠左的区间左端点,使得在该 ...

  3. 编译ITK

    [2016年7月4周]编译ITK 1.下载必备文件 InsightToolkit-4.8.1.cmake 2.cmake编译 修改CMAKE_INSTALL_PREFIX配置到需要生成的目录下面去. ...

  4. HTML5视频标签video

    现阶段,我们要在网页中嵌入视频的最可靠最常用的办法是使用Flash,通过使用<object>和<embed>标签,就可以通过浏览器播放swf,flv等格式视频文件,但是前提是浏 ...

  5. thinkphp隐藏中url的index.php

    在本地进行测试 1.修改apache配置文件将如下代码#去掉 #LoadModule rewrite_module modules/mod_rewrite.so   在index.php 目录下新建文 ...

  6. apache commons Java包简介

    更多信息,请参考:http://commons.apache.org/ 一.Commons BeanUtils说明:针对Bean的一个工具集.由于Bean往往是有一堆get和set组成,所以BeanU ...

  7. 传递给系统调用的数据区域太小。 (异常来自 HRESULT:0x8007007A)

    在做结构体向字节数组转换的时候,常遇到"传递给系统调用的数据区域太小"的错误,究其原因是因为英文与汉字的编码方式不同,一个汉字等于两个字节,而一个英文字母等于1个字节.所以,对于如 ...

  8. sql去除某个字段中的某个字符串 replace

    update A set col1 =REPLACE ( col1 ,'测试' , '') where col1 like '%测试%' 在使用过程中如果遇到text类型的字段时会报 参数数据类型 t ...

  9. UVA 11404 五 Palindromic Subsequence

     Palindromic Subsequence Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu ...

  10. C# POST与Get数据

    引用DLL 普通Get数据和Post数据 public static string Get(string URL) { String ReCode = string.Empty; try { Http ...