luoguP3312 [SDOI2014]数表
题意
默认\(n\leqslant m\)。
设\(f(i)\)表示\(i\)的约数和,因为是积性函数,可以用线性筛求。
先不考虑\(a\)的限制,我们推下式子:
\(\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}f(\gcd(i,j))\)
枚举\(\gcd(i,j)\)
\(\sum\limits_{d=1}^{n}f(d)\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}[\gcd(i,j)=d]\)
之后就莫反:
\(\sum\limits_{d=1}^{n}f(d)\sum\limits_{i=1}^{\frac{n}{d}}\sum\limits_{j=1}^{\frac{m}{d}}[\gcd(i,j)=1]\)
\(\sum\limits_{d=1}^{n}f(d)\sum\limits_{i=1}^{\frac{n}{d}}\sum\limits_{j=1}^{\frac{m}{d}}\sum\limits_{x|\gcd(i,j)}\mu(x)\)
\(\sum\limits_{d=1}^{n}f(d)\sum\limits_{x=1}^{\frac{n}{d}}\mu(x)\sum\limits_{i=1}^{\frac{n}{d}}\sum\limits_{j=1}^{\frac{m}{d}}[x|\gcd(i,j)]\)
\(\sum\limits_{d=1}^{n}f(d)\sum\limits_{x=1}^{\frac{n}{d}}\mu(x)*\frac{n}{d*x}*\frac{m}{d*x}\)
设\(T=d*x\):
\(\sum\limits_{T=1}^{n}\frac{n}{T}*\frac{m}{T}\sum\limits_{d|T}f(d)*\mu(\frac{T}{d})\)
除法分块加预处理\(\sum\limits_{d|T}f(d)*\mu(\frac{T}{d})\)即可。
对于\(a\)的限制,我们离线按\(a\)排序,同时用树状数组维护即可。
code:
#include<bits/stdc++.h>
using namespace std;
#define pli pair<ll,int>
#define mkp make_pair
#define fir first
#define sec second
typedef long long ll;
const int maxn=1e5+10;
const int maxq=2*1e4+10;
const ll mod=2147483648;
int Q;
int mu[maxn];
ll g[maxn],ans[maxq];
bool vis[maxn];
pli f[maxn];
vector<int>prime;
struct Query{int n,m,lim,id;}qr[maxq];
struct Tree_arry
{
#define lowbit(x) (x&-x)
ll a[maxn];
inline void add(int x,ll k){for(int i=x;i<=100000;i+=lowbit(i))a[i]=(a[i]+k)%mod;}
inline ll query(int x){ll res=0;for(int i=x;i;i-=lowbit(i))res=(res+a[i])%mod;return res;}
}tr;
inline bool cmp(Query x,Query y){return x.lim<y.lim;}
inline void pre_work(int n)
{
mu[1]=1;f[1]=mkp(1,1);vis[1]=1;
for(int i=2;i<=n;i++)
{
if(!vis[i])prime.push_back(i),mu[i]=-1,f[i]=mkp(i+1,i),g[i]=i+1;
for(unsigned int j=0;j<prime.size()&&i*prime[j]<=n;j++)
{
vis[i*prime[j]]=1;
if(i%prime[j]==0)
{
mu[i*prime[j]]=0;
g[i*prime[j]]=g[i]*prime[j]+1;
f[i*prime[j]]=mkp(f[i].fir/g[i]*g[i*prime[j]],i*prime[j]);
break;
}
mu[i*prime[j]]=-mu[i];
f[i*prime[j]]=mkp(f[i].fir*f[prime[j]].fir,i*prime[j]);
g[i*prime[j]]=prime[j]+1;
}
}
}
inline void work(int x)
{
for(int i=1;i*f[x].sec<=100000;i++)tr.add(i*f[x].sec,(f[x].fir*mu[i]%mod+mod)%mod);
}
inline ll calc(int n,int m)
{
ll res=0;
if(n>m)swap(n,m);
for(int l=1,r;l<=n;l=r+1)
{
r=min(n/(n/l),m/(m/l));
res=(res+((tr.query(r)-tr.query(l-1))%mod+mod)%mod*(n/l)%mod*(m/l)%mod)%mod;
}
return res;
}
int main()
{
pre_work(100000);
sort(f+1,f+100000+1);
scanf("%d",&Q);
for(int i=1;i<=Q;i++)scanf("%d%d%d",&qr[i].n,&qr[i].m,&qr[i].lim),qr[i].id=i;
sort(qr+1,qr+Q+1,cmp);
for(int i=1,j=1;i<=Q;i++)
{
while(f[j].fir<=qr[i].lim&&j<=100000)work(j),j++;
ans[qr[i].id]=calc(qr[i].n,qr[i].m);
}
for(int i=1;i<=Q;i++)printf("%lld\n",ans[i]);
return 0;
}
luoguP3312 [SDOI2014]数表的更多相关文章
- BZOJ 3529: [Sdoi2014]数表 [莫比乌斯反演 树状数组]
3529: [Sdoi2014]数表 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1399 Solved: 694[Submit][Status] ...
- 【BZOJ 3529】 [Sdoi2014]数表 (莫比乌斯+分块+离线+树状数组)
3529: [Sdoi2014]数表 Description 有一张N×m的数表,其第i行第j列(1 < =i < =礼,1 < =j < =m)的数值为能同时整除i和j的所有 ...
- BZOJ 3259 [Sdoi2014]数表 (莫比乌斯反演 + 树状数组)
3529: [Sdoi2014]数表 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2321 Solved: 1187[Submit][Status ...
- 洛咕3312 [SDOI2014]数表
洛咕3312 [SDOI2014]数表 终于独立写出一道题了...真tm开心(还是先写完题解在写的) 先无视a的限制,设\(f[i]\)表示i的约数之和 不妨设\(n<m\) \(Ans=\su ...
- 【BZOJ3529】[Sdoi2014]数表 莫比乌斯反演+树状数组
[BZOJ3529][Sdoi2014]数表 Description 有一张N×m的数表,其第i行第j列(1 < =i < =礼,1 < =j < =m)的数值为能同时整除i和 ...
- 洛谷 P3312 [SDOI2014]数表 解题报告
P3312 [SDOI2014]数表 题目描述 有一张\(N*M\)的数表,其第\(i\)行第\(j\)列(\(1\le i \le n\),\(1 \le j \le m\))的数值为能同时整除\( ...
- BZOJ3529 [Sdoi2014]数表 【莫比乌斯反演】
3529: [Sdoi2014]数表 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 2151 Solved: 1080 [Submit][Status ...
- BZOJ[Sdoi2014]数表 莫比乌斯反演
[Sdoi2014]数表 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2383 Solved: 1229[Submit][Status][Disc ...
- 洛谷P3312 - [SDOI2014]数表
Portal Solution 共\(T(T\leq2\times10^4)\)组测试数据.给出\(n,m(n,m\leq10^5),a(a\leq10^9)\),求\[ \sum_{i=1}^n\s ...
随机推荐
- @Component, @Service, @Controller, @Repository区别
@Component, @Service, @Controller, @Repository是spring注解,注解后可以被spring框架所扫描并注入到spring容器来进行管理 @Componen ...
- Word论文
粘贴图片不完整,只显示一行? 问题:行距被固定了 临时解决:设置多倍行距,推荐值1.5 1. 点一下图片,然后选择样式-正文 即可, 2. 或者为图片创建专用样式,需要时就点一下: 开始-样式(点样式 ...
- vue使用--环境搭建与基本项目创建说明
桃之夭夭,思绪纷飞. 一.环境搭建 1.安装node.js(包含包管理工具npm) 安装包可以到node官网进行下载,穿梭>>> 根据自己的操作系统下载相应版本的安装包,运行后按照操 ...
- windows/tomcat 修改java虚拟机JVM以utf-8字符集加载class文件的两种方式
1.情景展示 做了这么长时间的java开发,但是,你知道JVM是以怎样的编码加载.解析class文件的吗? 我们知道,通常情况下,我们会将java文件的字符集修改成utf-8,这样,理所当然地就认 ...
- 关于书籍《区块链以太坊DApp开发实战》的内容告示
书中所列举的以太坊 etherscan 浏览器,原链接已经不能使用国内网络正常访问了,需要翻墙,下面的链接不需要翻墙,也是 etherscan 的官方浏览器链接: 以太坊浏览器:https://cn. ...
- servlet中的IllegalStateException
IllegalStateException在java web开发中比较常见,IllegalStateException的根本原因是java servlet在提交响应后,还尝试写内容. 所以避免Ille ...
- win10怎么打开服务界面?
在键盘上同时点击“win+R”键弹出运行界面,输入services.msc,按确定. 这时就弹出了服务的界面,如图:
- 纯C语言实现顺序队列
#include <stdio.h> #include <stdlib.h> #define MAXSIZE 6 typedef int QElemType; typedef ...
- iOS处理含中文的请求链接
NSString *urlStr = @""; // 将中文URL进行转码 urlStr = [urlStr stringByAddingPercentEscapesUsingEn ...
- 【PHP】关于系统性能追踪工具molten
一.简介 关于molten的介绍网上有很多,是一个全链路追踪的工具,Molten可以看做是phptrace的的升级版(流行的php问题定位工具譬如phptrace,xhprof,这些工具可以自行Goo ...