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. 《Effective Java》学习笔记 ——异常

    充分发挥异常的优点,可以提高程序的可读性.可靠性和可维护性. 第57条 只针对异常的情况才使用异常 第58条 对可恢复的情况使用受检异常,对编程错误使用运行时异常 * 如果期望调用者能够适当的恢复,使 ...

  2. kafka的简单理解

    经典组合: Flume+Kafka+Storm+HDFS/HBase Flume:分布式采集 Kafka:分布式缓存 Kafka简介: 一种分布式的.基于发布/订阅的消息系统(Scala编写的) Ka ...

  3. 面向 Photoshop 的英特尔® Texture Works 插件

    英特尔对 Photoshop* 进行了扩展,以通过插件充分利用最新的图像压缩方法 (BCn/DXT).该插件旨在为图形工作者提供一款获取卓越压缩结果的工具,并提高 Photoshop* 中的压缩速度. ...

  4. Fabric Dev开发调试模式的搭建过程

    在利用Fabric开发Chaincode的时候,调试Chaincode显得尤为不方便,因为Chaincode正常应该运行在Docker容器中,每次修改Chaincode后想要使其更改生效必须得对Cha ...

  5. MSSQL批量写入数据方案

    近来有一个项目Feature需要有批量写入数据的场景,正巧整理资料发现自己以前也类似实现的项目,在重构的同时把相关资料做了一个简单的梳理,方便大家参考. 循环写入(简单粗暴,毕业设计就这样干的)(不推 ...

  6. vue入门全局配置

    全局配置 Vue.config 是一个对象,包含 Vue 的全局配置.可以在启动应用之前修改下列属性: silent 类型:boolean 默认值:false 用法: Vue.config.silen ...

  7. PAT甲题题解-1071. Speech Patterns (25)-找出现最多的单词

    分割字符串的用法+map映射给出input中出现次数最多的单词,如果次数相同,给出按字典序最小的. 这里我用了自定义分隔符来读取字符串,方法如下: //按照定义的分隔符d来分割字符串,对str进行读取 ...

  8. PAT甲题题解-1121. Damn Single (25)-水题

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789787.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  9. Daily Scrum NO.1

    工作概况 符美潇(PM): 今日工作 1.根据开发进程分配第一步开发工作,对相应的成员提出今日的开发要求:要求成员自己所负责的线程池,动态爬取,去重,文件分类等部分进行资料的相关了解. 2.Daily ...

  10. 【MOOC EXP】Linux内核分析实验三报告

     程涵  原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 [跟踪分析Linux内核的启动过程] ...