~~~题面~~~

题解:

设$f(d)$表示数$d$的约数和,那么$(i, j)$中的数为$f(gcd(i, j))$,
那么有2种枚举方法。
1,枚举每一格看对应的$f(d)$是几.$$ans = \sum_{i = 1}^{n}\sum_{j = 1}^{m}{f(gcd(i, j))}$$
2,枚举$d$看有哪些格子的$f$值为$f(d)$.
$$ans = \sum_{i = 1}^{min(n, m)}{f(d)}\sum_{x = 1}^{n}\sum_{y = 1}^{m}[gcd(x, y) == d]$$
显然后者更加方便。
所以$$ans = \sum_{i = 1}^{min(n, m)}{f(d)}\sum_{x = 1}^{n}\sum_{y = 1}^{m}[gcd(x, y) == d]$$
$$ans = \sum_{i = 1}^{min(n, m)}{f(d)}\sum_{x = 1}^{\lfloor{\frac{n}{d}}\rfloor}\sum_{y = 1}^{\lfloor{\frac{m}{d}}\rfloor}[gcd(x, y) == 1]$$
$$ans = \sum_{i = 1}^{min(n, m)}{f(d)}\sum_{x = 1}^{\lfloor{\frac{n}{d}}\rfloor}\sum_{y = 1}^{\lfloor{\frac{m}{d}}\rfloor}\sum_{t | gcd(x, y)}{\mu(t)}$$
$$\sum_{i = 1}^{min(n, m)}f(d)\sum_{t = 1}^{min(\lfloor{\frac{n}{d}}\rfloor, \lfloor{\frac{m}{d}}\rfloor)}{\lfloor{\frac{\lfloor{\frac{n}{d}}\rfloor}{t}}\rfloor}{\lfloor{\frac{\lfloor{\frac{m}{d}}\rfloor}{t}}\rfloor}\mu(t)$$<---看有多少对$(x, y)$统计到了$\mu(t)$(即为$\mu(t)$的倍数/有因子$\mu(t)$)
$$\sum_{i = 1}^{min(n, m)}f(d)\sum_{t =1}^{min(\lfloor{\frac{n}{d}}\rfloor, \lfloor{\frac{m}{d}}\rfloor)}{\lfloor{\frac{n}{td}\rfloor}}{\lfloor{\frac{m}{td}\rfloor}}\mu(t)$$
令$T = td$,则
$$ans = \sum_{T = 1}^{min(n, m)}{\lfloor{\frac{n}{T}}\rfloor \lfloor{\frac{m}{T}}\rfloor} \sum_{d|T}f(d)\mu(\frac{T}{d})$$
因为$T = td$,所以符合要求的$d$满足$d|T$.
设$$g(T) = \sum_{d | T}f(d)\mu(\frac{T}{d}) \Longleftrightarrow f(T) = \sum_{d | T}g(d)$$
则$$ans = \sum_{T = 1}^{min(n, m)}{\lfloor{\frac{n}{T}}\rfloor \lfloor{\frac{m}{T}}\rfloor} g(T)$$
但是由于有$a$的限制,对于不同的$a$,$g(T)$的值是不同的,因此先筛出$f$数组,然后将$f$按$f_{i}$排序,离线询问,一个一个把符合条件的$f(d)$加入$g$数组,也就是每次处理询问时再暴力将$f(d)$的贡献加给满足$d|T$的$g(T)$,但是由于要维护$g$数组的前缀和,因此用树状数组维护$g$数组
根据$f$数组的定义,
当$x\quad mod \quad p_{i} \quad != \quad 0$有$f(x \cdot P_{i}) = f(x) + f(x) \cdot P_{i}$,其中$P_{i}$是质数
否则有$f(x \cdot p_{i}) = f(x) \cdot p_{i} + f(t)$,其中$t$为$x$除去质因数$p_{i}$后的值

 #include<bits/stdc++.h>
using namespace std;
#define R register int
#define AC 101000
#define ac 100000
#define LL long long
#define p 2147483648LL
int t, tot, l;
int prime[AC], mu[AC];
LL g[AC];
bool z[AC];
struct node{
int n, m, a, id;LL ans;
}s[AC];
struct kkk{
int d;
LL w;
}f[AC]; inline int read()
{
int x = ;char c = getchar();
while(c > '' || c < '') c = getchar();
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x;
} inline bool cmp(node a, node b)
{
return a.a < b.a;
} inline bool cmp1(kkk a, kkk b)
{
return a.w < b.w;
} inline int lowbit(int x)
{
return x & (-x);
} inline void add(int x, int S)
{
// if(x <= 4)printf("add %d : %d\n", x, S);
for(R i = x; i <= ac; i += lowbit(i)) g[i] += S;
} inline LL find(int x)
{
LL rnt = ;
for(R i = x; i; i -= lowbit(i)) rnt += g[i];
return rnt;
} void pre()
{
t = read();
for(R i = ; i <= t; i++)
s[i].n = read(), s[i].m = read(), s[i].a = read(), s[i].id = i;
sort(s + , s + t + , cmp);
} void get()
{
int x;
f[] =(kkk){, }, mu[] = ;
for(R i = ; i <= ac; i++)
{
f[i].d = i;
if(!z[i]) prime[++tot] = i, f[i].w = i + , mu[i] = -;
for(R j = ; j <= tot; j++)
{
x = prime[j];
if(x * i > ac) break;
z[x * i] = true;
if(!(i % x))
{
int t = i;
while(!(t % x)) t /= x;
f[x * i].w = f[t].w + f[i].w * x;
break;
}
mu[x * i] = -mu[i];
f[x * i].w = f[i].w + f[i].w * x;
}
}
sort(f + , f + ac + , cmp1);
} void build(int a)//更新树状数组
{
for(R i = l + ; i <= ac; i++)
{
if(f[i].w > a) return ;
++l;
for(R j = f[i].d; j <= ac; j += f[i].d)
add(j, f[i].w * mu[j / f[i].d]);
}
} inline bool cmp2(node a, node b)
{
return a.id < b.id;
} void work()
{
for(R i = ; i <= t; i++)
{
build(s[i].a);
int b = min(s[i].n, s[i].m), pos;
for(R j = ; j <= b; j = pos + )
{
pos = min(s[i].n / (s[i].n / j), s[i].m / (s[i].m / j));
s[i].ans += (s[i].n / j) * (s[i].m / j) * (find(pos) - find(j - ));
s[i].ans = (s[i].ans + p) % p;//取模error!!!取模的时候记得+p....
}//error!!!无论何时都要+p并取模,,因为可能前面取模后再减就变负数了。。。。加个判断就应对不了负数的情况了
// printf("\n");
}
sort(s + , s + t + , cmp2);
for(R i = ; i <= t; i++) printf("%lld\n", s[i].ans);
} int main()
{
freopen("in.in", "r", stdin);
//freopen("sdoi2014shb.in", "r", stdin);
//freopen("sdoi2014shb.out", "w", stdout);
pre();
get();
work();
fclose(stdin);
//fclose(stdout);
return ;
}

[SDOI2014]数表 莫比乌斯反演的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. BZOJ[Sdoi2014]数表 莫比乌斯反演

    [Sdoi2014]数表 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 2383  Solved: 1229[Submit][Status][Disc ...

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

    $ans=\sum_{i=1}^n\sum_{j=1}^n\sigma(gcd(i,j))$ 枚举gcd为d的所有数得到 $ans=\sum_{d<=n}\sigma(d)*g(d)$ $g(d ...

  10. BZOJ3529: [Sdoi2014]数表(莫比乌斯反演,离线)

    Description 有一张 n×m 的数表,其第 i 行第 j 列(1 <= i <= n, 1 <= j <= m)的数值为 能同时整除 i 和 j 的所有自然数之和.给 ...

随机推荐

  1. 8、Java并发编程:同步容器

    Java并发编程:同步容器 为了方便编写出线程安全的程序,Java里面提供了一些线程安全类和并发工具,比如:同步容器.并发容器.阻塞队列.Synchronizer(比如CountDownLatch). ...

  2. C# 调用webserver 出现:未能从程序集“jgd3jufm, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null”中加载类型

    一般都是 用的动态调用webserver,然后这次用的是固定的 首先 最后 实例化改接口,然后直接传值调用

  3. 监控系统cpu相关统计信息

    背景:需要测试监控各个操作系统平台机器上的cpu相关的各种统计信息 为了方便测试,我写了一个比较通用的shell脚本,目前可以兼容Redhat6+,Redhat7+,其他操作系统没测,可以实时监控机器 ...

  4. CentOS 7.2 安装zabbix 3.4

    一.zabbix版本选择及部署环境说明 1.zabbix版本选择 zabbix官网地址:www.zabbix.com zabbix每半年发布一个长期支持版,目前长期支持版有2.0.3.0等,所以选择z ...

  5. lesson 23 one man's meat is another man's poison

    lesson 23 one man's meat is another man's poison delicacy n. 美味:佳肴: delicious adj. 美味的:可口的 关于虚拟语气: I ...

  6. Machine Learning笔记整理 ------ (五)决策树、随机森林

    1. 决策树 一般的,一棵决策树包含一个根结点.若干内部结点和若干叶子结点,叶子节点对应决策结果,其他每个结点对应一个属性测试,每个结点包含的样本集合根据属性测试结果被划分到子结点中,而根结点包含样本 ...

  7. C++ 学习笔记之——STL 库 queue

    1. 队列 queue 队列是一种容器适配器,专门用来满足先进先出的操作,也就是元素在容器的一端插入并从另一端提取. bool empty() const; 返回队列是否为空: size_type s ...

  8. POJ 3028 Shoot-out(概率DP)

    Description This is back in the Wild West where everybody is fighting everybody. In particular, ther ...

  9. Thunder团队第二周 - Scrum会议1

    Scrum会议1 小组名称:Thunder 项目名称:爱阅app Scrum Master:王航 工作照片: 参会成员: 王航(Master):http://www.cnblogs.com/wangh ...

  10. 2019寒假训练营第三次作业part1-网络空间安全概论第五章

    第五章 网络攻防技术 5.1 网路信息收集技术--网络踩点 黑客入侵系统之前,需要了解目标系统可能存在的: 管理上的安全缺陷和漏洞 网络协议安全缺陷与漏洞 系统安全缺陷与漏洞 黑客实施入侵过程中,需要 ...