数表( table )

题目描述

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

输入

输入包含多组数据。

输入的第一行一个整数Q表示测试点内的数据组数,接下来Q行,每行三个整数n,m,a(|a|≤109)描述一组数据。

输出

对每组数据,输出一行一个整数,表示答案模231的值。

样例输入

<span style="color:#333333"><span style="color:#333333">2
4 4 3
10 10 5
</span></span>

样例输出

<span style="color:#333333"><span style="color:#333333">20
148
</span></span>

提示


solution

好题,我不会

令f[i]表示i的约数的和

题目求

gcd提出来

反演,再把gcd提出来

这就有60分了

但是这样子式子还是化不了

我们枚举i=k*d

这样子就能把nm的往前提

把询问按a排序,按a依次加入f[k]*mu[i/k]

前面的部分可以分块,后边的前缀和起来

也就是我要支持加入和查询前缀和。

树状数组即可。

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 2000006
using namespace std;
int n,Q,mu[maxn],pri[maxn],flag[maxn],sum[maxn],Max,tot;
int ans[maxn],tree[maxn];
struct node{
int n,m,a,b,id;
}s[maxn],f[maxn];
bool cmp(node A,node B){
return A.a<B.a;
}
void add(int i,int v){
for(;i<=Max;i+=i&-i)tree[i]+=v;
}
int ask(int i){
int sum=0;for(;i;i-=i&-i)sum+=tree[i];
return sum;
}
int Query(int N,int M){
int nex,sum=0;
if(N>M)swap(N,M);
for(int i=1;i<=N;i=nex+1){
nex=min(N/(N/i),M/(M/i));
//if(nex<i)exit(0);
sum+=(N/i)*(M/i)*(ask(nex)-ask(i-1));
}
return sum;
}
int main()
{
n=1000000;mu[1]=1;
for(int i=2;i<=n;i++){
if(!flag[i]){
pri[++tot]=i;mu[i]=-1;
}
for(int j=1;j<=tot&&pri[j]<=n/i;j++){
flag[i*pri[j]]=1;mu[i*pri[j]]=-mu[i];
if(i%pri[j]==0){
mu[i*pri[j]]=0;
break;
}
}
}
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j+=i)f[j].a+=i;
}
for(int i=1;i<=n;i++)f[i].b=i;
sort(f+1,f+n+1,cmp);
cin>>Q;
for(int i=1;i<=Q;i++){
scanf("%d%d%d",&s[i].n,&s[i].m,&s[i].a);
s[i].id=i;
if(s[i].n>s[i].m)swap(s[i].n,s[i].m);
Max=max(Max,s[i].m);
} sort(s+1,s+Q+1,cmp);
int l=1;
for(int i=1;i<=Q;i++){
for(;f[l].a<=s[i].a&&l<=n;l++){
for(int N=f[l].b;N<=Max;N+=f[l].b)
add(N,f[l].a*mu[N/f[l].b]);
}
ans[s[i].id]=Query(s[i].n,s[i].m);
if(ans[s[i].id]<0)ans[s[i].id]+=(1<<31);
}
for(int i=1;i<=Q;i++)printf("%d\n",ans[i]);
return 0;
}

最新文章

  1. JS 4 新特性:混合属性(mixins)
  2. 进程物理内存远大于Xmx的问题分析
  3. 注解:【有连接表的】Hibernate单向N-&gt;N关联
  4. Iometer介绍与使用
  5. 验证码点击刷新 this.src=this.src+&#39;?&#39;+Math.random()
  6. 进入git diff 界面,无法继续输入命令
  7. 重构13-Extract Method Object(提取方法对象)
  8. GitBook配置
  9. 【NOIP2013】DAY1题解+代码
  10. 如何编写Hexo主题
  11. 面试(二)---synchronized
  12. (栈)leetcode856 Score of Parentheses
  13. 【Java基础】15、负数的二进制表示方法
  14. 移动基于Percona XTRADB Cluster的大数据解决方式
  15. JDBC Oracle sys 用户连接
  16. com.fasterxml.jackson.databind.ObjectMapper. .readValue .convertValue
  17. android view surfaceView GLSurfaceView
  18. Python的 numpy中 numpy.ravel() 和numpy.flatten()的区别和使用
  19. JS实现拖拽效果
  20. 【Ural】1519. Formula 1 插头DP

热门文章

  1. 【学时总结】 ◆学时&#183;IV◆ 数位DP
  2. Java中堆、栈,静态方法和非静态方法的速度问题
  3. Maven - 修改本地仓库位置
  4. JavaScript 事件机制
  5. java经常看见 jdk5 jdk1.5 —— jdk6 jdk1.6 这两者有什么区别吗?
  6. scapy--初识
  7. 课时68.id选择器(掌握)
  8. 裸机——Nand
  9. C++基础 new和delete
  10. Pandas 数据读取