数表

Description

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

Input

  输入包含多组数据。

  输入的第一行一个整数Q,表示测试点内的数据组数;

  接下来Q行,每行三个整数n,m,a(|a|<=10^9 )描述一组数据。

Output

  对每组数据,输出一行一个整数,表示答案模2^31的值。

Sample Input

2

4 4 3

10 10 5

Sample Output

20

148

Hint

不妨设\(n<m\)。

同时整除\(i,j\)的自然数之和就是\(gcd(i,j)\)的约数之和。我们设\(f(i)=\sum_{d|i}d\)。

则:

\[\displaystyle ans=\sum_{g=1}^{n}f(g)\sum_{i=1}^{\lfloor \frac{n}{g} \rfloor}\sum_{j=1}^{\lfloor \frac{m}{g} \rfloor}[gcd(i,j)=1]\\
=\sum_{g=1}^{n}f(g)\sum_{i=1}^{\lfloor \frac{n}{g} \rfloor}\sum_{j=1}^{\lfloor \frac{m}{g} \rfloor}\sum_{d|i,d|j}\mu(d)
\]

又来套路一波:设\(T=gd\),\(\displaystyle ans=\sum_{T=1}^{n}\sum_{d|T}\mu(d)f(\frac{n}{d})\lfloor \frac{n}{T} \rfloor\lfloor \frac{m}{T} \rfloor\)。

然后又了a的限制后,我们就将询问和\(f\)都离线下来排序,加入树状数组里面。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<complex>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<ctime>
#include<queue>
#include<iomanip>
#define ll long long
#define N 100005
#define int ll using namespace std;
inline int Get() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}while('0'<=ch&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;} int Q;
int pri[N];
bool vis[N];
ll sum[N];
int mu[N];
struct node {
int id;
ll sum;
bool operator <(const node &a)const {
return sum<a.sum;
}
}st[N];
int cnt;
struct query {
int n,m,id;
ll a;
bool operator <(const query &x)const {return a<x.a;}
}q[20005]; void pre(int n) {
mu[1]=1;
for(int i=2;i<=n;i++) {
if(!vis[i]) {
pri[++pri[0]]=i;
mu[i]=-1;
}
for(int j=1;j<=pri[0]&&i*pri[j]<=n;j++) {
vis[i*pri[j]]=1;
if(i%pri[j]==0) {
mu[i*pri[j]]=0;
break;
}
mu[i*pri[j]]=-mu[i];
}
}
for(int i=1;i<=n;i++) {
for(int j=i;j<=n;j+=i) {
sum[j]+=i;
}
}
cnt=n;
for(int i=1;i<=n;i++) st[i]=(node) {i,sum[i]};
} ll tem[N];
int low(int i) {return i&(-i);}
const ll mod=(1ll<<31);
void add(int v,ll f) {for(int i=v;i<=100000;i+=low(i)) (tem[i]+=f)%=mod;}
void update(int v) {
for(int i=v;i<=100000;i+=v) {
if(!mu[i/v]) continue ;
add(i,(sum[v]*mu[i/v]%mod+mod)%mod);
}
} ll Ask(int v) {
ll ans=0;
for(int i=v;i;i-=low(i)) (ans+=tem[i])%=mod;
return ans;
}
ll Ask(int l,int r) {return (Ask(r)-Ask(l-1)+mod)%mod;}
ll ans[20005];
int now; ll solve(int n,int m) {
if(n>m) swap(n,m);
int last;
ll ans=0;
for(int i=1;i<=n;i=last+1) {
last=min(n/(n/i),m/(m/i));
(ans+=1ll*(n/i)*(m/i)%mod*Ask(i,last)%mod)%=mod;
}
return ans;
} signed main() {
pre(100000);
sort(st+1,st+1+cnt);
Q=Get();
for(int i=1;i<=Q;i++) {
q[i].n=Get(),q[i].m=Get(),q[i].a=Get();
q[i].id=i;
}
sort(q+1,q+1+Q);
int tag=1;
for(int i=1;i<=Q;i++) {
while(tag<=cnt&&st[tag].sum<=q[i].a) {
update(st[tag].id);
tag++;
}
now=i;
ans[q[i].id]=solve(q[i].n,q[i].m);
}
for(int i=1;i<=Q;i++) cout<<ans[i]<<"\n";
return 0;
}

【BZOJ3529】数表的更多相关文章

  1. [BZOJ3529]数表

    假设$n\leq m$,我们先不考虑$\leq a$的限制 $\sum\limits_{i=1}^n\sum\limits_{j=1}^m\sigma((i,j))=\sum\limits_{T=1} ...

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

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

  3. 【BZOJ3529】[Sdoi2014]数表 莫比乌斯反演+树状数组

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

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

    数表 bzoj-3529 Sdoi-2014 题目大意:n*m的数表,第i行第j列的数是同时整除i和j的所有自然数之和.给定a,求数表中所有不超过a的和. 注释:$1\le n,m \le 10^5$ ...

  5. 【BZOJ3529】【莫比乌斯反演 + 树状数组】[Sdoi2014]数表

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

  6. 【BZOJ3529】【SDOI2014】 数表

    Time Limit: 10 Sec Memory Limit: 512 MB Description ​ 有一张\(n×m\)的数表,其第i行第j列(\(,1 \le i \leq n,1 \le ...

  7. 【BZOJ3529】【SDOI2014】数表

    Time Limit: 1000 ms Memory Limit: 512 MB Description 有一张n×m的数表,其第i行第j列 (1≤i≤n,1≤j≤m)的数值为能同时整除i和j的所有自 ...

  8. bzoj千题计划205:bzoj3529: [Sdoi2014]数表

    http://www.lydsy.com/JudgeOnline/problem.php?id=3529 有一张n*m的数表,其第i行第j列(1 < =i < =n,1 < =j & ...

  9. 【SDOI2014】【BZOJ3529】数表

    Description 有一张N×m的数表,其第i行第j列(1 < =i < =礼.1 < =j < =m)的数值为 能同一时候整除i和j的全部自然数之和.给定a,计算数表中不 ...

随机推荐

  1. PHP算法之快速排序、冒泡排序

    快速排序 <?php Class Sort { //快速排序 public function quickly($array) { //判断排序的数组是否大于1 if (count($array) ...

  2. AngularJS+Ionic开发-1.搭建开发环境

    临时项目需要使用AngularJS+Ionic+Cordova技术,半年前跟别人用过一段时间做过几个页面,目前别人已经无法联系了,只能我自己上了. 上次做完项目后,想抽时间好好巩固一下这方面的知识面来 ...

  3. Repeater 控件的嵌套使用

      Repeater 控件的嵌套使用   ItemDataBound:数据绑定的时候(正在进行时)发生,多用在Repeater控件嵌套,对子Repeater控件进行数据绑定及模板列中统计列的计算处理等 ...

  4. javascript如何操作数组

    说明 如需求:后台返回一个用户列表数组,该数组可能为空,最多只可能会有10个用户, 页面中A,B两处展示用户列表,B处不管如何都会展示返回的所有用户,A处需要展示10个用户,不足10个展示默认用户, ...

  5. 初学HTML-6

    表单:专门用来收集用户信息 表单元素:在HTML中,标签/标记/元素都是指HTML中的标签. eg:<a>a标签/a标记/a元素 浏览器中所以得表单标签都有特殊的外观和默认的功能. 格式: ...

  6. 洛谷P4424 [HNOI/AHOI2018]寻宝游戏(思维题)

    题意 题目链接 Sol 神仙题Orz Orz zbq爆搜70.. 考虑"与"和"或"的性质 \(0 \& 0 = 0, 1 \& 0 = 0\) ...

  7. 【读书笔记】iOS-微定位技术

    在大型商场,医院或是大楼里,你是否曾经有过找不到想去的地方的经历呢?这种情况下采用传统的定位方法就有些力不从心了.首先这些地方不能采用GPS定们,而Wifi和蜂窝式移动电话基站定位误差比较大.这种情况 ...

  8. CloudSim源代码学习——服务代理商(DatacenterBroker)

    DatacenterBroker.java文件如下: (其中,相关语句已经做好标注) /* * Title: CloudSim Toolkit * Description: CloudSim (Clo ...

  9. loadrunner 脚本优化-加密与解密

    脚本优化-加密与解密 by:授客 QQ:1033553122   密码加密 可以给密码加密,意在把结果字符串作为脚本的参数或者参数值.例如,完整可能有一个用户密码填写的表单,你想测试网站针对不同密码的 ...

  10. android 保存图片,及将图片更新到图库

    **保存图片 public static File saveImage(Bitmap bmp) { File appDir = new File(Environment.getExternalStor ...