http://www.lydsy.com/JudgeOnline/problem.php?id=3529

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

20000 组询问  n<=1e5

f(k)表示 k 的 约数和

g(k)表示 

f(k)的求法:

http://www.cnblogs.com/TheRoadToTheGold/p/8228969.html

g(k)的求法:

http://www.cnblogs.com/TheRoadToTheGold/p/6609495.html

假设没有a的限制

不妨令n<=m

令i*d=t,把后面两个下取整提到前面

预处理出F(t),除法分块便可以在O(sqrt(n))求解

但是现在有f(i)<=a 的限制

离线处理,读入所有的询问

所以把f(i)按f(i)的值从小到大排序

询问按a的值从小到大排序

用树状数组维护当前F(t)的值

在处理这个询问之前

找出所有<=本次询问a的f(i)

在树状数组中i及i的倍数位置加上f(i)

取模不用管,自然溢出即可

#include<cstdio>
#include<iostream>
#include<algorithm> using namespace std; #define N 100001
#define M 20001 typedef long long LL; int T; int miu[N]; int p[N];
bool vis[N]; struct nodef
{
int d,val;
}f[N];
int c[N]; bool cmpf(nodef A,nodef B)
{
if(A.val!=B.val) return A.val<B.val;
return A.d<B.d;
} struct Query
{
int id;
int n,m,a;
}Q[M]; bool cmpQ(Query A,Query B)
{
return A.a<B.a;
} int ans[M]; struct BIT
{
int s[N]; #define lowbit(x) x&-x void add(int x,int val)
{
while(x<N-)
{
s[x]=s[x]+val;
x+=lowbit(x);
}
} int query(int x)
{
int sum=;
while(x)
{
sum=sum+s[x];
x-=lowbit(x);
}
return sum;
} }Bit; void read(int &x)
{
x=; int f=; char c=getchar();
while(!isdigit(c)) { if(c=='-') f=-; c=getchar(); }
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
x*=f;
} void pref()
{
int cnt=;
miu[]=;
f[].d=;
f[].val=;
for(int i=;i<N;++i)
{
f[i].d=i;
if(!vis[i])
{
p[++cnt]=i;
miu[i]=-;
f[i].val=i+;
c[i]=;
}
for(int j=;j<=cnt;++j)
{
if(i*p[j]>=N) break;
vis[i*p[j]]=true;
if(i%p[j]==)
{
f[i*p[j]].val=f[i].val*p[j]+c[i];
c[i*p[j]]=c[i];
break;
}
miu[i*p[j]]=-miu[i];
f[i*p[j]].val=f[i].val*(p[j]+);
c[i*p[j]]=f[i].val;
}
}
sort(f+,f+N,cmpf);
} void init()
{
read(T);
for(int i=;i<=T;++i)
{
read(Q[i].n);
read(Q[i].m);
read(Q[i].a);
Q[i].id=i;
}
sort(Q+,Q+T+,cmpQ);
} void solve()
{
int nowQ=;
while(Q[nowQ].a<=) nowQ++;
int nowd=;
int j,res;
int tot,lastsum,nowsum;
for(;nowQ<=T;++nowQ)
{
while(nowd<N && f[nowd].val<=Q[nowQ].a)
{
for(int i=f[nowd].d;i<N;i+=f[nowd].d)
Bit.add(i,f[nowd].val*miu[i/f[nowd].d]);
nowd++;
}
if(Q[nowQ].n>Q[nowQ].m) swap(Q[nowQ].n,Q[nowQ].m);
tot=lastsum=;
for(int i=;i<=Q[nowQ].n;i=j+)
{
j=min(Q[nowQ].n/(Q[nowQ].n/i),Q[nowQ].m/(Q[nowQ].m/i));
nowsum=Bit.query(j);
res=nowsum-lastsum;
res=res*(Q[nowQ].n/i)*(Q[nowQ].m/i);
tot+=res;
lastsum=nowsum;
}
tot+= tot< ? 1LL<< : ;
ans[Q[nowQ].id]=tot;
}
for(int i=;i<=T;++i) cout<<ans[i]<<'\n';
} int main()
{
pref();
init();
solve();
}

bzoj千题计划205:bzoj3529: [Sdoi2014]数表的更多相关文章

  1. bzoj千题计划205:bzoj1966: [Ahoi2005]VIRUS 病毒检测

    http://www.lydsy.com/JudgeOnline/problem.php?id=1966 f[i][j] 表示s的前i个和t的前j个是否匹配 转移看代码 注意初始化: f[0][0]= ...

  2. bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块

    http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...

  3. bzoj千题计划141:bzoj3532: [Sdoi2014]Lis

    http://www.lydsy.com/JudgeOnline/problem.php?id=3532 如果没有字典序的限制,那么DP拆点最小割即可 加上字典序的限制: 按c从小到大枚举最小割边集中 ...

  4. bzoj千题计划196:bzoj4826: [Hnoi2017]影魔

    http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...

  5. bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪

    http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...

  6. bzoj千题计划177:bzoj1858: [Scoi2010]序列操作

    http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...

  7. bzoj千题计划317:bzoj4650: [Noi2016]优秀的拆分(后缀数组+差分)

    https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式 ...

  8. bzoj千题计划304:bzoj3676: [Apio2014]回文串(回文自动机)

    https://www.lydsy.com/JudgeOnline/problem.php?id=3676 回文自动机模板题 4年前的APIO如今竟沦为模板,,,╮(╯▽╰)╭,唉 #include& ...

  9. bzoj千题计划292:bzoj2244: [SDOI2011]拦截导弹

    http://www.lydsy.com/JudgeOnline/problem.php?id=2244 每枚导弹成功拦截的概率 = 包含它的最长上升子序列个数/最长上升子序列总个数 pre_len ...

随机推荐

  1. Js_数组操作

    用 js有很久了,但都没有深究过js的数组形式.偶尔用用也就是简单的string.split(char).这段时间做的一个项目,用到数组的地方很多,自以为js高手的自己居然无从下手,一下狠心,我学!呵 ...

  2. OpenGL:使用顶点数组法绘制正六面体

    在今天的opengl的课程以及实验中,我们学习了如何使用顶点数组的方法来绘制图形,但相信还有很多同学对它的实际使用方法不太了解,我们就用我们今天实验课上的实例来简单讲解一下 题目及要求 绘制一个正六面 ...

  3. 现代OpenGL渲染管线介绍

    原文摘选自 现代OpenGL渲染管线介绍 此文对最新的OpenGL做一个简单的介绍,如有理解错误,敬请指正.英文原文: https://glumpy.github.io/modern-gl.html ...

  4. 【Alpha】第三次Scrum meeting

    今日任务一览: 导航栏诞生 前期准备的Latex文本将撰写完毕 生成燃尽图的问题已经解决 姓名 今日完成任务 所耗时间 刘乾 用Github成功生成了燃尽图(真是不容易啊...),与架构师继续每日面基 ...

  5. java 面试 心得

    16. ArrayList list = new ArrayList(20);中的list扩充几次() A 0     B 1     C 2      D 3 答案:A 解析:这里有点迷惑人,大家都 ...

  6. 人民币-欧元预测(ARIMA算法)代码

    import pandas as pd import matplotlib.pyplot as plt import statsmodels as sm from statsmodels.graphi ...

  7. [菜鸟]HTTP 与 HTTPS 的区别

    HTTP 与 HTTPS 的区别 分类 编程技术 基本概念 HTTP(HyperText Transfer Protocol:超文本传输协议)是一种用于分布式.协作式和超媒体信息系统的应用层协议. 简 ...

  8. fetch API & upload file

    fetch API & upload file https://github.com/github/fetch/issues/89 https://stackoverflow.com/ques ...

  9. ABP-JavaScript API

    一.AJAX 1,ABP采用的方式 ASP.NET Boilerplate通过用abp.ajax函数包装AJAX调用来自动执行其中的一些步骤. 一个例子ajax调用: var newPerson = ...

  10. SQLServer将一个表的数据导入到另一个表

    1.假如A表存在 insert into A(a,b,c) (select a,b,c from B) 2.假如A表不存在 select a,b,c into A from B 3.假如需要跨数据库 ...