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)}$就好了
由于具有循环性质,在倍数位置加上就好了
取模卡我好长时间,没想到是这种方法。
代码:
  1 #include<cstdio>
  2 #include<cstring>
  3 #include<algorithm>
  4 typedef long long lnt;
  5 const int N=300010;
  6 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];
  7 int prime[N];
  8 int miu[N];
  9 bool vis[N];
 10 int cnt;
 11 int line[N];
 12 struct qust{
 13     int n,m,a;
 14     int no;
 15     int ans;
 16 }q[N];
 17 int lowbit(int x)
 18 {
 19     return x&(-x);
 20 }
 21 void update(int pos,int v)
 22 {
 23     while(pos<N)
 24     {
 25         line[pos]+=v;
 26         pos+=lowbit(pos);
 27     }
 28     return ;
 29 }
 30 int query(int pos)
 31 {
 32     int ans=0;
 33     while(pos)
 34     {
 35         ans+=line[pos];
 36         pos-=lowbit(pos);
 37     }
 38     return ans;
 39 }
 40 void gtp(void)
 41 {
 42     miu[1]=1;
 43     for(int i=2;i<N;i++)
 44     {
 45         if(!vis[i])
 46         {
 47             prime[++cnt]=i;
 48             miu[i]=-1;
 49         }
 50         for(int j=1;j<=cnt&&prime[j]*i<N;j++)
 51         {
 52             int x=i*prime[j];
 53             vis[x]=true;
 54             if(i%prime[j]==0)
 55             {
 56                 miu[x]=0;
 57                 break;
 58             }
 59             miu[x]=-miu[i];
 60         }
 61     }
 62     for(int i=1;i<N;i++)
 63     {
 64         for(int j=i;j<N;j+=i)
 65             F[j].a+=i;
 66         F[i].b=i;
 67     }
 68     return ;
 69 }
 70 bool cmp(qust x,qust y)
 71 {
 72     return x.a<y.a;
 73 }
 74 bool cmq(qust x,qust y)
 75 {
 76     return x.no<y.no;
 77 }
 78 int main()
 79 {
 80     gtp();
 81     int T;
 82     scanf("%d",&T);
 83     for(int i=1;i<=T;i++)
 84     {
 85         scanf("%d%d%d",&q[i].n,&q[i].m,&q[i].a);
 86         q[i].no=i;
 87     }
 88     std::sort(q+1,q+T+1,cmp);
 89     std::sort(F+1,F+N);
 90     for(int i=1,j=1;i<=T;i++)
 91     {
 92         for(;j<N&&F[j].a<=q[i].a;j++)
 93         {
 94             for(int k=F[j].b;k<N;k+=F[j].b)
 95                 update(k,F[j].a*miu[k/F[j].b]);
 96         }
 97         int n=q[i].n,m=q[i].m;
 98         if(n>m)
 99             std::swap(n,m);
100         for(int u=1,v;u<=n;u=v+1)
101         {
102             v=std::min(n/(n/u),m/(m/u));
103             q[i].ans+=(query(v)-query(u-1))*(n/u)*(m/u);
104         }
105     }
106     std::sort(q+1,q+T+1,cmq);
107     for(int i=1;i<=T;i++)
108         printf("%d\n",q[i].ans&(0x7fffffff));
109     return 0;
110 }

转载于:https://www.cnblogs.com/blog-Dr-J/p/10161596.html

BZOJ3529: [Sdoi2014]数表(莫比乌斯反演,离线)相关推荐

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

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

  2. [BZOJ3529][Sdoi2014]数表

    [BZOJ3529][Sdoi2014]数表 试题描述 有一张N×m的数表,其第i行第j列(1 < =i < =n,1 < =j < =m)的数值为能同时整除i和j的所有自然数 ...

  3. BZOJ 3529: [Sdoi2014]数表 莫比乌斯

    3529: [Sdoi2014]数表 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 1879  Solved: 949 [Submit][Statu ...

  4. bzoj3529: [Sdoi2014]数表

    %%%Po姐姐 https://wenku.baidu.com/view/fbec9c63ba1aa8114431d9ac.html [题意] 见原题 [题解] 一个数对(x,y)的公约数必定是其最大 ...

  5. (每日一题)P3312 [SDOI2014]数表(经典莫比乌斯反演 + 树状数组维护离线询问)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 每日一题(莫反 / 多项式 / 母函数 / 群论) 2021.4.11 莫反 P3312 [SDOI2 ...

  6. 【BZOJ3529】数表,莫比乌斯反演+BIT

    传送门 思路: 复习一下莫比乌斯反演 好像是数论入门题,然后我做了近一天-- 式子是这么化没错 n≤mn≤m ∑i=1n∑j=1m[σ(gcd(i,j))≤a]σ(gcd(i,j)) \sum^n_{ ...

  7. P3312 [SDOI2014]数表(离线 + 树状数组前缀和优化)

    P3312 [SDOI2014]数表 推式子 ∑i=1n∑j=1mσ(gcd(i,j))∑d=1nσ(d)∑i=1nd∑j=1md[gcd(i,,j)==1]∑d=1nσ(d)∑d=1ndμ(k)nk ...

  8. BZOJ 3529: [Sdoi2014]数表

    二次联通门 : BZOJ 3529: [Sdoi2014]数表 Latex的公式写起来略麻烦... 设$\LARGE F(x)=\sum_{d|x} \lfloor \dfrac xd \rfloor ...

  9. 莫比乌斯反演--懵逼反演系列

    反演的定义 设有数论函数f(n),g(n)f(n),g(n)f(n),g(n),其中g(n)g(n)g(n)已知 且f(n),g(n)f(n),g(n)f(n),g(n)满足关系g(n)=∑i=0na ...

最新文章

  1. apollo分布式配置中心原理
  2. php tp 支付宝 支付,php实现的支付宝网页支付功能示例【基于TP5框架】
  3. jQuery扩展实现复选框批操作
  4. 野生前端的数据结构基础练习(6)——集合
  5. 长城汽车申请“哈弗单身狗”、“哈弗奶狗”、“哈弗溜狗”等商标
  6. grafana的前端技术_Grafana开发环境搭建
  7. SyntaxError: Missing parentheses in call to 'print' 这个错误原因是Python版本问题
  8. 三种典型的博弈论问题(巴什博奕、威佐夫博奕、尼姆博奕)
  9. 前端计算机英语单词,解决文件命名,变量命名头皮发麻,单词超多1700个前端专属单词,css常用命名单词【起名字太烦了全背下来内卷吧小伙伴大前端时代来临了】
  10. 概率论与数理统计(陈希孺)笔记2.1
  11. Postman调接口时获取Chrome浏览器Cookie数据携带发送
  12. 几种比较好用的连接PostgreSQL的客户端
  13. 【软件工程Ⅱ】作业二 |分布式版本控制系统Git的安装与使用
  14. 群同态和群同构的区别_顾沛《抽象代数》1.4群的同态与同构习题解答
  15. 系统容量评估和性能保障
  16. 设备间子系统的工程技术
  17. Cisco WLC和瘦ap的配置
  18. vue服务端渲染——项目搭建、开发、生产环境的部署、浏览渲染、SEO优化
  19. win10下深度linux系统怎么安装,u深度win10pe安装win10系统教程
  20. 5款好用的mysql客户端

热门文章

  1. python后端设计_Python后端设计模式
  2. 小学校园计算机兴趣小组,小学计算机兴趣小组活动记录文本.doc
  3. android 任意剪切view,Android 任意View切圆角
  4. Java内存五大区_一:jvm的五大内存区(内存结构)
  5. qt设置边框颜色_Qt开源作品14-导航按钮控件
  6. python删除列表空格_python 删除列表里所有空格项的方法总结
  7. 大数据要学javaweb吗_大数据是私有财产吗?
  8. git实现审核功能_使用 Pull Request 功能进行代码审查
  9. oracle之 监听器无法启动的几个原因总结
  10. Android通讯录查询篇--ContactsContract.Data 二