在你以为理解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. The Pilots Brothers' refrigerator 分类: POJ 2015-06-15 19:34 12人阅读 评论(0) 收藏

    The Pilots Brothers' refrigerator Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 20304 ...

  2. css基本样式总结

    1:背景(background) <!DOCTYPE html> <html> <head lang="en"> <meta charse ...

  3. python中给for循环增加索引

    for index, item in enumerate(Foo()): print "index: ", index, " item: ",item 用enu ...

  4. noi 2971 抓住那头牛

    2971:抓住那头牛 查看 提交 统计 提问 总时间限制:  2000ms 内存限制:  65536kB 描述 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上,农夫起始位于点N(0<=N ...

  5. TestNG测试框架在基于Selenium进行的web自动化测试中的应用

    转载请注明出自天外归云的博客园:http://www.cnblogs.com/LanTianYou/ TestNG+Selenium+Ant TestNG这个测试框架可以很好的和基于Selenium的 ...

  6. ACM-ICPC国际大学生程序设计竞赛北京赛区(2016)网络赛 A Simple Job

    描述 Institute of Computational Linguistics (ICL), Peking University is an interdisciplinary institute ...

  7. 【LTE基础知识】SGLTE, SVLTE, CSFB, VoLTE

    4G网络下实现语音通话功能的技术共有三种--VoLTE.SGLTE(GSM /LTE同步并发)和CSFB(电路域回落).简单来说: VoLTE就是语音数据都在4G通道内完成: SGLTE是语音走2G通 ...

  8. What Your Computer Does While You Wait

    转: CPU的等待有多久? 原文标题:What Your Computer Does While You Wait 原文地址:http://duartes.org/gustavo/blog/ [注:本 ...

  9. c++ stl string char* 向 string 转换的问题

    请看下面代码 string AddString(const string& a,const string & b) { return a + b; } int _tmain(int a ...

  10. FreeSWITCH一些需求应对

    一.用户号码组 听到这个名词的时候,心中还挺迷茫,需求如下: 一个用户分配号码为800,但是这个用户有一部座机,两部手机:有人拨打800这个号码时,这个用户的所有关联终端都要振铃. 其实就是用户号码多 ...