在你以为理解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. recv send 阻塞和非阻塞

    http://blog.csdn.net/xiaofei0859/article/details/6037814 int send( SOCKET s, const char FAR *buf, in ...

  2. vsftp 使用匿名帐号登陆

    1.正常安装. 2.改配置文件:vi /etc/vsftpd/vsftpd.conf #允许匿名用户登录FTP anonymous_enable=YES #设置匿名用户的登录目录(如需要,需自己添加并 ...

  3. range函数

    th> a=torch.range(,) [.0001s] th> a [torch.DoubleTensor of size ] [.0002s] th> a=torch.rang ...

  4. java反编译工具JD-GUI

    这款java反编译工具是由C++写的,是一款免费的非商业用途的软件,(Xjad也不错,但是不支持jar反编译) 一.支持众多.class反编译工具 二.支持反编译jar

  5. 解决This function or variable may be unsafe

    工程名字右键属性-->C/C++-->预处理器-->预处理器定义-->加入:_CRT_SECURE_NO_WARNINGS

  6. C#获取CPUID(MD5输出),网卡ID,主DNS,备用DNS

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...

  7. 【leetcode❤python】21. Merge Two Sorted Lists

    #-*- coding: UTF-8 -*- # Definition for singly-linked list.# class ListNode(object):#     def __init ...

  8. git push 403

    1. 在github上新建一个空项目. 2. git clone 到本地仓库. 3. git add [一些文件]. 4. git commit -m "first commit" ...

  9. POSTMAN中各种请求方式的区别

    1.form-data:  就是http请求中的multipart/form-data,它会将表单的数据处理为一条消息,以标签为单元,用分隔符分开.既可以上传键值对,也可以上传文件.当上传的字段是文件 ...

  10. 业务对象和BAPI

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...