Description

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

Input

输入包含多组数据。
输入的第一行一个整数Q表示测试点内的数据组数
接下来Q行,每行三个整数n,m,a(|a| < =10^9)描述一组数据。
1 < =N.m < =10^5  , 1 < =Q < =2×10^4

Output

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

Sample Input

2
4 4 3
10 10 5

Sample Output

20
148

解题思路:

这道题就是让我们求${\sum_{i=1}^{N}}{\sum_{j=1}^{M}}{\sigma(gcd(i,j))}({\sigma(gcd(i,j))}<=a)$
a比较让人恶心,考虑将${\sigma(gcd(i,j))}$按次序加入答案,直接统计,就是一种离线的做法。
那么就不需要考虑a了,答案就变成了(设n<=m)
${\sum_{i=1}^{n}}{\sum_{j=1}^{m}}{\sigma(gcd(i,j))}$
$={\sum_{d=1}^{n}}{\sigma(d)}{\sum_{d|i}}{n}{\sum_{d|j}^{m}}[gcd(i,j)==d]$
$={\sum_{d=1}^{n}}{\sigma(d)}{\sum_{i=1}^{\left \lfloor {\frac{n}{d}} \right \rfloor}}{\sum_{j=1}^{\left \lfloor {\frac{n}{d}} \right \rfloor}}{[gcd(i,j)==1]}$
$={\sum_{d=1}^{n}}{\sigma(d)}{\sum_{k=1}^{\left \lfloor {\frac{n}{d}} \right \rfloor}}{\mu(k)}{\left \lfloor {\frac{n}{dk}} \right \rfloor}{\left \lfloor {\frac{m}{dk}} \right \rfloor}$
设T=dk
$={\sum_{T=1}^{n}}{\sum_{d|T}}{\sigma(d)}{\mu(\frac{T}{d})}{\left \lfloor {\frac{n}{T}} \right \rfloor}{\left \lfloor \frac{m}{T} \right \rfloor}$
按顺序加入${\sigma(d)}$就好了
由于具有循环性质,在倍数位置加上就好了
取模卡我好长时间,没想到是这种方法。
代码:
 #include<cstdio>
#include<cstring>
#include<algorithm>
typedef long long lnt;
const int N=;
struct int_2{int a,b;bool friend operator < (int_2 x,int_2 y){if(x.a!=y.a)return x.a<y.a;return x.b<y.b;}}F[N];
int prime[N];
int miu[N];
bool vis[N];
int cnt;
int line[N];
struct qust{
int n,m,a;
int no;
int ans;
}q[N];
int lowbit(int x)
{
return x&(-x);
}
void update(int pos,int v)
{
while(pos<N)
{
line[pos]+=v;
pos+=lowbit(pos);
}
return ;
}
int query(int pos)
{
int ans=;
while(pos)
{
ans+=line[pos];
pos-=lowbit(pos);
}
return ans;
}
void gtp(void)
{
miu[]=;
for(int i=;i<N;i++)
{
if(!vis[i])
{
prime[++cnt]=i;
miu[i]=-;
}
for(int j=;j<=cnt&&prime[j]*i<N;j++)
{
int x=i*prime[j];
vis[x]=true;
if(i%prime[j]==)
{
miu[x]=;
break;
}
miu[x]=-miu[i];
}
}
for(int i=;i<N;i++)
{
for(int j=i;j<N;j+=i)
F[j].a+=i;
F[i].b=i;
}
return ;
}
bool cmp(qust x,qust y)
{
return x.a<y.a;
}
bool cmq(qust x,qust y)
{
return x.no<y.no;
}
int main()
{
gtp();
int T;
scanf("%d",&T);
for(int i=;i<=T;i++)
{
scanf("%d%d%d",&q[i].n,&q[i].m,&q[i].a);
q[i].no=i;
}
std::sort(q+,q+T+,cmp);
std::sort(F+,F+N);
for(int i=,j=;i<=T;i++)
{
for(;j<N&&F[j].a<=q[i].a;j++)
{
for(int k=F[j].b;k<N;k+=F[j].b)
update(k,F[j].a*miu[k/F[j].b]);
}
int n=q[i].n,m=q[i].m;
if(n>m)
std::swap(n,m);
for(int u=,v;u<=n;u=v+)
{
v=std::min(n/(n/u),m/(m/u));
q[i].ans+=(query(v)-query(u-))*(n/u)*(m/u);
}
}
std::sort(q+,q+T+,cmq);
for(int i=;i<=T;i++)
printf("%d\n",q[i].ans&(0x7fffffff));
return ;
}

BZOJ3529: [Sdoi2014]数表(莫比乌斯反演,离线)的更多相关文章

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

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

  2. bzoj3529: [Sdoi2014]数表 莫比乌斯反演

    题意:求\(\sum_{i=1}^n\sum_{j=1}^nf(gcd(i,j))(gcd(i,j)<=a),f(x)是x的因子和函数\) 先考虑没有限制的情况,考虑枚举gcd为x,那么有\(\ ...

  3. BZOJ3529: [Sdoi2014]数表(莫比乌斯反演 树状数组)

    题意 题目链接 Sol 首先不考虑\(a\)的限制 我们要求的是 \[\sum_{i = 1}^n \sum_{j = 1}^m \sigma(gcd(i, j))\] 用常规的套路可以化到这个形式 ...

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

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

  5. bzoj [SDOI2014]数表 莫比乌斯反演 BIT

    bzoj [SDOI2014]数表 莫比乌斯反演 BIT 链接 bzoj luogu loj 思路 \[ \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}a*[f[ ...

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

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

  7. BZOJ 3529 [Sdoi2014]数表 (莫比乌斯反演+树状数组+离线)

    题目大意:有一张$n*m$的数表,第$i$行第$j$列的数是同时能整除$i,j$的所有数之和,求数表内所有不大于A的数之和 先是看错题了...接着看对题了发现不会做了...刚了大半个下午无果 看了Po ...

  8. BZOJ 3259 [Sdoi2014]数表 (莫比乌斯反演 + 树状数组)

    3529: [Sdoi2014]数表 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 2321  Solved: 1187[Submit][Status ...

  9. BZOJ 3529: [Sdoi2014]数表 [莫比乌斯反演 树状数组]

    3529: [Sdoi2014]数表 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1399  Solved: 694[Submit][Status] ...

随机推荐

  1. 基于BP神经网络的简单字符识别算法自小结(C语言版)

    本文均属自己阅读源代码的点滴总结.转账请注明出处谢谢. 欢迎和大家交流.qq:1037701636 email:gzzaigcn2009@163.com 写在前面的闲话: 自我感觉自己应该不是一个非常 ...

  2. 第六课 Struts的视图组件

    Struts框架的视图负责为客户提供动态网页内容. Struts的视图主要由JSP网页构成.此外还包含客户化的标签和ActionForm Bean.这些组件提供了 对国际化.接收用户输入的表单数据.表 ...

  3. Activity的launchMode和任务栈小结

    对Activity的launchMode的理解一直没有好好总结下,这两天系统总结下launchMode的使用方法: Activity的launchMode属性决定了Activity和应用程序当前任务栈 ...

  4. JAVA中jar包和war包的区别是

    其实jar包和war包都可以看成压缩文件,用解压软件都可以打开,jar包和war包所存在的原因是,为了项目的部署和发布,通常把项目打包,通常在打包部署的时候,会在里面加上部署的相关信息. 这个打包实际 ...

  5. SQL解析XML文件

    DECLARE @idoc int DECLARE @doc varchar(max) SET @doc ='<?xml version="1.0" encoding=&qu ...

  6. Windows10上使用windbg调试Chromium Windows。

    ###目的###Windows10上使用windbg调试Chromium Windows. 安装Windows 10 SDK时, 就包含了windbg.exe."C:\Program Fil ...

  7. file---探测给定文件的类型

    file命令用来探测给定文件的类型.file命令对文件的检查分为文件系统.魔法幻数检查和语言检查3个过程. 语法 file(选项)(参数) 选项 -b:列出辨识结果时,不显示文件名称: -c:详细显示 ...

  8. 分享到twitter,facebook,google,yahoo,linkedined,msn

    编辑器加载中... 1. 分享到twitter的代码” title=”分享到 Twitter” target=”_blank” rel=”nofollow”>Twitter 2. 分享到Face ...

  9. boost.property_tree的高级用法(你们没见过的操作)

    版权声明:本文为博主原创文章,未经博主允许不得转载. 前一阵写项目,终于将这个boost下的xml读取类完成了,由于网上对property_trees的讲解很少,最多也就到get_child这个层面, ...

  10. android ActionBar的使用

    Action Bar主要功能包括:   1. 显示选项菜单   2. 提供标签页的切换方式的导航功能,能够切换多个fragment.    3.  提供下拉的导航条目.   4. 提供交互式活动视图取 ...