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)$表示所有(i,j)=d的二元组的数量。
那么可以反演得到$g(i)=\sum_{i \mid d}\mu(\lfloor d/i \rfloor )*\lfloor n/d \rfloor * \lfloor m/d \rfloor$
然后代入然后xjb变换可得
$ans=\sum_{d<=n}\lfloor n/d \rfloor * \lfloor m/d \rfloor \sum_{i \mid d}\mu( \lfloor d/i \rfloor ) * \sigma(i) $
然后我们要求出$\sum_{i \mid d}\mu(\lfloor d/i \rfloor ) *\sigma(i) $的前缀和就可以$\sqrt n$的时间内解决了
那么我们可以用每个数去暴力更新倍数即可,但是它是一个积性函数,是可以在$\Theta(n)$的时间内筛出来的。
但是有A的条件,我们可以去维护前缀和用树状数组,暴力更新倍数即可。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
#define md 2147483647
#define inf 0x3f3f3f3f
#define maxn 100005
struct query{int n,m,k,id,ans;}a[maxn]; struct Bit_Tree{
int x[maxn];
void add(int i,int f)
{for (;i<maxn;i+=i&(-i))x[i]+=f;}
int gs(int i)
{
int ret=0;
for (;i;i-=i&(-i)) ret+=x[i];
return ret;
}
}BT; int sigma[maxn],pr[maxn],top,mu[maxn],min_fac_a[maxn],min_fac_sum[maxn],rk[maxn]; void init()
{
sigma[1]=1;mu[1]=1;rk[1]=1;
F(i,2,maxn-1)
{
rk[i]=i;
if (!sigma[i])
{
pr[++top]=i;
min_fac_a[i]=i;
sigma[i]=min_fac_sum[i]=i+1;
mu[i]=-1;
}
F(j,1,top)
{
if (pr[j]*i>=maxn) break;
if (i%pr[j]==0)
{
sigma[pr[j]*i]=sigma[i]/min_fac_sum[i]*
(min_fac_sum[pr[j]*i]=min_fac_sum[i]+min_fac_a[i]*pr[j]);
min_fac_a[pr[j]*i]=min_fac_a[i]*pr[j];
mu[pr[j]*i]=0;
break;
}
sigma[pr[j]*i]=sigma[pr[j]]*sigma[i];
min_fac_a[pr[j]*i]=pr[j];
min_fac_sum[pr[j]*i]=pr[j]+1;
mu[pr[j]*i]=-mu[i];
}
}
} int t; bool cmp(query x,query y)
{return x.k<y.k;} bool cmp2(query x,query y)
{return x.id<y.id;} bool cmp3(int x,int y)
{return sigma[x]<sigma[y];} void add(int i)
{
F(j,1,inf)
{
if (i*j>=maxn) break;
BT.add(i*j,sigma[i]*mu[j]);
}
} int solve(int n,int m)
{
int ret=0;
for (int i=1,last=0;i<=n;i=last+1)
{
last=min(n/(n/i),m/(m/i));
ret+=(BT.gs(last)-BT.gs(i-1))*(n/i)*(m/i);
}
return ret&md;
} int main()
{
init();
sort(rk+1,rk+maxn,cmp3);
scanf("%d",&t);
F(i,1,t)
{
scanf("%d%d%d",&a[i].n,&a[i].m,&a[i].k);
if (a[i].n>a[i].m) swap(a[i].n,a[i].m);
a[i].id=i;
}
sort(a+1,a+t+1,cmp);
int now=0;
F(i,1,t)
{
while (sigma[rk[now+1]]<=a[i].k) add(rk[++now]);
a[i].ans=solve(a[i].n,a[i].m);
}
sort(a+1,a+t+1,cmp2);
F(i,1,t) printf("%d\n",a[i].ans);
}
BZOJ 3529 [Sdoi2014]数表 ——莫比乌斯反演 树状数组的更多相关文章
- BZOJ 3529: [Sdoi2014]数表 [莫比乌斯反演 树状数组]
3529: [Sdoi2014]数表 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1399 Solved: 694[Submit][Status] ...
- BZOJ 3529 [Sdoi2014]数表 (莫比乌斯反演+树状数组+离线)
题目大意:有一张$n*m$的数表,第$i$行第$j$列的数是同时能整除$i,j$的所有数之和,求数表内所有不大于A的数之和 先是看错题了...接着看对题了发现不会做了...刚了大半个下午无果 看了Po ...
- BZOJ 3259 [Sdoi2014]数表 (莫比乌斯反演 + 树状数组)
3529: [Sdoi2014]数表 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2321 Solved: 1187[Submit][Status ...
- 【BZOJ3529】[Sdoi2014]数表 莫比乌斯反演+树状数组
[BZOJ3529][Sdoi2014]数表 Description 有一张N×m的数表,其第i行第j列(1 < =i < =礼,1 < =j < =m)的数值为能同时整除i和 ...
- BZOJ3529: [Sdoi2014]数表(莫比乌斯反演 树状数组)
题意 题目链接 Sol 首先不考虑\(a\)的限制 我们要求的是 \[\sum_{i = 1}^n \sum_{j = 1}^m \sigma(gcd(i, j))\] 用常规的套路可以化到这个形式 ...
- luogu3312 [SDOI2014]数表 (莫比乌斯反演+树状数组)
link \(\sum_{i=1}^n\sum_{j=1}^m[s(\gcd(i,j))\le a]s(\gcd(i,j))\) \(=\sum_{p=1}^ns(p)[s(p)\le a]\sum_ ...
- bzoj 3529 数表 莫比乌斯反演+树状数组
题目大意: 有一张N×m的数表,其第i行第j列(1 < =i < =礼,1 < =j < =m)的数值为能同时整除i和j的所有自然数之和.给定a,计算数表中不大于a的数之和. ...
- 【BZOJ3529】【莫比乌斯反演 + 树状数组】[Sdoi2014]数表
Description 有一张N×m的数表,其第i行第j列(1 < =i < =礼,1 < =j < =m)的数值为 能同时整除i和j的所有自然数之和.给定a,计算数表中不大于 ...
- BZOJ_3529_[Sdoi2014]数表_莫比乌斯反演+树状数组
Description 有一张 n×m 的数表,其第 i 行第 j 列(1 <= i <= n, 1 <= j <= m)的数值为 能同时整除 i 和 j 的所有自然数之和.给 ...
随机推荐
- CodeForces 149D Coloring Brackets (区间DP)
题意: 给一个合法的括号序列,仅含()这两种.现在要为每对括号中的其中一个括号上色,有两种可选:蓝or红.要求不能有两个同颜色的括号相邻,问有多少种染色的方法? 思路: 这题的模拟成分比较多吧?两种颜 ...
- 洛谷 P2936 [USACO09JAN]全流Total Flow
题目描述 Farmer John always wants his cows to have enough water and thus has made a map of the N (1 < ...
- 按Home键切换到后台后会触发libGPUSupportMercury.dylib: gpus_ReturnNotPermittedKillClient导致crash
转自:http://www.eoeandroid.com/thread-251598-1-1.html 好像有很多朋友都碰到过这个问题,即在真机调试时,按hone键返回桌面,再回到app时,app会c ...
- poj2104 K大数 划分树
题意:给定一个数列,求一个区间的第K大数 模板题, 其中的newl, newr 有点不明白. #include <iostream> #include <algorithm> ...
- 测试类执行报错:AttributeError: 'Testlei' object has no attribute 'test_cases' 和data,unpack用法解析
a=[{"}] import unittest from ddt import ddt,data,unpack @ddt class Testlei(unittest.TestCase): ...
- OpenWrite方法打开现有文件并进行写入
实现效果: 知识运用: File类的OpenWrite方法 //实现打开现有文件以进行写入 public static FileStream OpenWrite (string path) Encod ...
- 关于jQuery中的$发生冲突及解决方案
问题描述: 在Jquery库中,$是JQuery的别名,所有使用$的地方也都可以使用JQuery来替换,如$('#msg')等同于JQuery('#msg')的写法. 当引入多个js库后,其它的js库 ...
- shell脚本,如何监控mysql数据库。
[root@localhost wyb]# cat jkmysql #!/bin/bash status=`/etc/init.d/mysqld status|grep running|wc -l` ...
- Log4J的配置与使用详解
一.简介 Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件.甚至是套接口服务器.NT的事件记录器.UNIX Syslog守护 ...
- javascript设计模式(张容铭)学习笔记 - 照猫画虎-模板方法模式
模板方法模式(Template Method):父类中定义一组操作算法骨架,而降一些实现步骤延迟到子类中,使得子类可以不改变父类的算法结构的同时可重新定义算法中某些实现步骤. 项目经理体验了各个页面的 ...