在你以为理解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. 使用 MNIST 图像识别数据集

    机器学习领域中最迷人的主题之一是图像识别 (IR). 使用红外系统的示例包括使用指纹或视网膜识别的计算机登录程序和机场安全系统的扫描乘客脸寻找某种通缉名单上的个人.MNIST 数据集是可用于实验的简单 ...

  2. Robberies(简单的01背包 HDU2955)

    Robberies Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  3. csharp通过dll调用opencv函数,图片作为参数

    [blog 项目实战派]csharp通过dll调用opencv函数,图片作为参数          ​一直想做着方面的研究,但是因为这个方面的知识过于小众,也是由于自己找资料的能力比较弱,知道今天才找 ...

  4. hdu 1205 从整体考虑

    吃糖果 Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submiss ...

  5. Sql Server 2008完全卸载方法(其他版本类似)

    一.    SQL2008卸载. 1.从控制面板卸载 1)点击计算机右下角“开始”,点击“控制面板” 2)点击“卸载程序”. 3)在程序列表中找到“Microsoft SQL Server 2008” ...

  6. 取出ip address control的ip字符

    1.给这个空间设置control型变量 m_add; 2.定义4个字节型变量,来获取控件中的4个ip字节 BYTE a,b,c,d: m_add.GetAddress(a,,b,c,d): 3.定义I ...

  7. win7下如何安装JDK

    第一步:点击下载好的JDK安装程序,百度一下,网上很多,然后弹出如下界面,点击“下一步”即可. 2 第二步:此时比较关键,设置安装的路径,可以事先建立一个文件夹,以在D盘为例,如D:\java. 3 ...

  8. SD卡驱动分析(一)

    Android下的SD卡驱动与标准LINUX下的SD卡驱动好像没有太大的区别,这里就以高通的ANDROID 2.3以代表,来简要分析一下LINUX下SD卡驱动的写法.由于小弟的技术有限,分析的有错的地 ...

  9. 【leetcode❤python】 299. Bulls and Cows

    #-*- coding: UTF-8 -*-class Solution(object):      def getHint(self, secret, guess):          " ...

  10. css选择器选择顺序是从右往左的,为什么?

    https://segmentfault.com/q/1010000000713509 为什么 CSS 选择器解析的时候是从右往左? CSS 的后代选择器本身就是一种在标准里面不那么推荐的方式. 首先 ...