【SDOI2014】数表
题面
题解
不管$a$的限制
我们要求的东西是:($\sigma(x)$是$x$的约数个数和)
$ \sum_{i=1}^n\sum_{j=1}^m\sigma(gcd(i,j)) $
设$f(x)=\sigma(x)$,则我们可以找到一个$g$使得$f=1*g$,那么$g=\mu*f$
所以$g(x)=\sum_{d|x}\mu(d)\sigma(\frac xd)$
带入原式得:
$ \sum_{i=1}^n\sum_{j=1}^m\sigma(gcd(i,j)) \\ =\sum_{d=1}^n g(d)\left\lfloor\frac nd\right\rfloor \left\lfloor\frac md\right\rfloor \\ =\sum_{d=1}^n \left\lfloor\frac nd\right\rfloor \left\lfloor\frac md\right\rfloor \sum_{x|d}\mu(x)\sigma(\frac dx) $
我们可以筛出$g(x)$的值来$O(\sqrt n)$回答
但是现在有$a$的限制,就可以离线将询问排序,将$\sigma$排序,加入相对应的位置就可以了。
代码
#include<cstdio>
#include<cstring>
#include<cctype>
#include<climits>
#include<algorithm>
#define RG register
#define file(x) freopen(#x".in", "r", stdin);freopen(#x".out", "w", stdout);
#define clear(x, y) memset(x, y, sizeof(x))
inline int read()
{
int data = 0, w = 1; char ch = getchar();
while(ch != '-' && (!isdigit(ch))) ch = getchar();
if(ch == '-') w = -1, ch = getchar();
while(isdigit(ch)) data = data * 10 + (ch ^ 48), ch = getchar();
return data * w;
}
const int maxn(100010);
bool not_prime[maxn];
int prime[maxn], cnt, n, T, ans[maxn];
int mu[maxn], sig[maxn], sumd[maxn], powd[maxn];
struct qry { int n, m, a, id; } q[maxn];
int p[maxn], c[maxn];
inline bool operator < (const qry &a, const qry &b) { return a.a < b.a; }
void init(int N)
{
not_prime[1] = true; sig[1] = mu[1] = p[1] = 1;
for(RG int i = 2; i <= N; i++)
{
p[i] = i;
if(!not_prime[i]) prime[++cnt] = i, mu[i] = -1,
sig[i] = i + 1, sumd[i] = i + 1, powd[i] = i;
for(RG int j = 1; j <= cnt && i * prime[j] <= N; j++)
{
not_prime[i * prime[j]] = true;
if(i % prime[j])
{
mu[i * prime[j]] = -mu[i];
sig[i * prime[j]] = sig[i] * sig[prime[j]];
sumd[i * prime[j]] = prime[j] + 1;
powd[i * prime[j]] = prime[j];
}
else
{
powd[i * prime[j]] = powd[i] * prime[j];
sumd[i * prime[j]] = sumd[i] + powd[i * prime[j]];
sig[i * prime[j]] = sig[i] / sumd[i] * sumd[i * prime[j]];
break;
}
}
}
}
inline bool cmp(int a, int b) { return sig[a] < sig[b]; }
void add(int x, int v) { while(x <= n) c[x] += v, x += x & -x; }
int query(int x) { int ans = 0; while(x) ans += c[x], x -= x & -x; return ans; }
int solve(int x, int y)
{
int now = 0, pre = 0, ans = 0;
for(RG int i = 1, j; i <= x; i = j + 1)
{
j = std::min(x / (x / i), y / (y / i));
now = query(j); ans += (x / i) * (y / i) * (now - pre);
pre = now;
}
return ans;
}
int main()
{
T = read();
for(RG int i = 1; i <= T; i++)
{
q[i] = (qry) {read(), read(), read(), i};
if(q[i].n > q[i].m) std::swap(q[i].n, q[i].m);
n = std::max(n, q[i].n);
}
init(n); std::sort(q + 1, q + T + 1);
std::sort(p + 1, p + n + 1, cmp);
for(RG int i = 1, j = 1; i <= T; i++)
{
for(; j <= n && sig[p[j]] <= q[i].a; ++j)
for(RG int k = p[j]; k <= n; k += p[j])
if(mu[k / p[j]]) add(k, sig[p[j]] * mu[k / p[j]]);
ans[q[i].id] = solve(q[i].n, q[i].m);
}
for(RG int i = 1; i <= T; i++)
{
if(ans[i] < 0) ans[i] += INT_MAX, ++ans[i];
printf("%d\n", ans[i]);
}
return 0;
}
【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 ...
- bzoj [SDOI2014]数表 莫比乌斯反演 BIT
bzoj [SDOI2014]数表 莫比乌斯反演 BIT 链接 bzoj luogu loj 思路 \[ \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}a*[f[ ...
随机推荐
- Java中String直接复制和new String创建对象的区别以及equals和==的区别和效率对比
编程语言中的问题很多时候我们看似懂,实际不懂,因为很多时候看不到更多的情况,从而缺少对这些看不到的情况的认知和解释. 今天mark一下String和new String()的区别.其实很简单. Str ...
- ubuntu服务器下tomcat安装(不推荐使用apt-get)
最近在阿里云服务器上装tomcat,一开始为了省事直接使用了apt-get安装,结果整个程序被拆开散到了好多地方,尤其是像网上说要把打包好了.war文件放到webapps文件夹下,但是开始并没有在/u ...
- iOS动画暂停和继续-本质是速度控制和时间坐标转换
时间永不停止! 写一个CALayer的分类,控制动画的暂停与继续 extension CALayer { ///暂停动画 func pauseAnimation() { //取出当前时间,转成动画暂停 ...
- [Python 多线程] RLock可重入锁 (九)
RLock 可重复锁,是线程相关的锁.同样是线程相关的还有threading.local. 线程A获得可重用锁,并可以多次成功获取,不会阻塞.最后要再线程A中和acquire次数相同的release. ...
- virtualbox+vagrant学习-5-Boxes-1-简介
Boxes boxes是vagrant环境的包格式.在vagrant支持的任何平台上,任何人都可以使用一个box来创建一个相同的工作环境.vagrant box实用程序提供了管理boxes的所有功能. ...
- Unicode字符集和UTF-8, UTF-16, UTF-32编码
ASCII 在过去的计算中,ASCII码被用来表示字符.英语只有26个字母和其他一些特殊字符和符号. 下表提供了ASCII字符及其相应的十进制和十六进制值. 可以从上面的表中推断,在十进制数系统中,A ...
- linux使用秘钥登录(禁用root密码登录)
目的:为了巩固线上外网服务器的安全,避免黑客攻击植入木马,初步决定禁用root密码登录(安全强度低),统一使用秘钥登录(4096位长度,安全性较高) 具体操作如下: 一.生成ssh秘钥: ssh-ke ...
- ORACLE NLS_LENGTH_SEMANTICS 参数的用途
NLS_LENGTH_SEMANTICS参数是一个专为创建CHAR和VARCHAR2两种字符型的列时,指定使用的字节长度,还是使用字符长度的定义方式,有byte和char两种值,默认为byte. 当设 ...
- 【Step By Step】将Dotnet Core部署到Docker下
一.使用.Net Core构建WebAPI并访问Docker中的Mysql数据库 这个的过程大概与我之前的文章<尝试.Net Core—使用.Net Core + Entity FrameWor ...
- 【Dubbo源码阅读系列】之远程服务调用(上)
今天打算来讲一讲 Dubbo 服务远程调用.笔者在开始看 Dubbo 远程服务相关源码的时候,看的有点迷糊.后来慢慢明白 Dubbo 远程服务的调用的本质就是动态代理模式的一种实现.本地消费者无须知道 ...