题目描述

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

输入输出格式

输入格式:

输入包含多组数据。 输入的第一行一个整数Q表示测试点内的数据组数,接下来Q行,每行三个整数n,m,a(|a| < =10^9)描述一组数据。

输出格式:

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

输入输出样例

输入样例#1:

2
4 4 3
10 10 5
输出样例#1:

20
148

说明

1 < =N.m < =10^5 , 1 < =Q < =2*10^4

题解:

令F[i]为i的因数和,g[i]为gcd=i的数量

则ans=∑∑F[gcd(i,j)]

          =∑dF[d]g[d]

g[d]=∑ij[gcd(i,j)==d]    (i<=n,j<=m)

    =∑∑[gcd(i,j)==1]      (i<=n/d,j<=m/d)

       =∑∑∑pμ(p)         (p|i,p|j)

       =∑pμ(p)∑∑1        (p<=n/d,i<=n/dp,j<=m/dp)

       =∑pμ(p)[n/dp][m/dp]

ans=∑dF[d]∑pμ(p)[n/dp][m/dp]

令k=dp

g[d]=∑k[n/k][m/k]μ(k/d)  (k<=n,d|k)

ans=∑k[n/k][m/k]∑dF[d]μ(k/d)   (d|k)

令f[k]=∑dF[d]μ(k/d)   (d|k)

处理处f的前缀和就行了,对于每个F[i],把它的f[x*i]全部加上F[i]*mu[x]

至于小于a的条件,离线按a排序,将F按从小到大顺序加入维护

分块就不说了

 #include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
struct data
{
int id,n,m,a;
}a[];
int Mod=(<<);
int f[],mu[],ms[],prime[],tot;
int c[],p[],now=,ans[];
bool vis[];
bool cmp2(data a,data b)
{
return a.a<b.a;
}
bool cmp(int a,int b)
{
return f[a]<f[b];
}
void mobius()
{int i,j;
mu[]=;
ms[]=;f[]=;
for (i=;i<=;i++)
{
if (vis[i]==)
{
mu[i]=-;
f[i]=i+;
ms[i]=i;
prime[++tot]=i;
}
for (j=;j<=tot,prime[j]*i<=;j++)
{
vis[i*prime[j]]=;
if (i%prime[j])
{
ms[i*prime[j]]=prime[j];
f[prime[j]*i]=f[i]*f[prime[j]];
mu[i*prime[j]]=-mu[i];
}
else
{
ms[prime[j]*i]=ms[i]*prime[j];
if (ms[i]==i) f[prime[j]*i]=(ms[prime[j]*i]*prime[j]-)/(prime[j]-);
else f[prime[j]*i]=f[i/ms[i]]*f[prime[j]*ms[i]];
mu[i*prime[j]]=;
break;
}
}
}
}
void add(int x,int d)
{
while (x<=)
{
c[x]+=d;
x+=(x&(-x));
}
}
int query(int x)
{
int s=;
while (x)
{
s+=c[x];
x-=(x&(-x));
}
return s;
}
void solve(int x)
{int j,pos,i,lasts,ss;
for (;f[p[now]]<=a[x].a;now++)
{
for (j=;p[now]*j<=;j++)
add(p[now]*j,f[p[now]]*mu[j]);
}
pos=;
lasts=;
for (i=;i<=a[x].n;i=pos+)
{
pos=min(a[x].n/(a[x].n/i),a[x].m/(a[x].m/i));
ss=query(pos);
ans[a[x].id]=(ans[a[x].id]+(a[x].n/i)*(a[x].m/i)*(ss-lasts));
//cout<<ans[a[x].id]<<' ';
lasts=ss;
}
while (ans[a[x].id]<) ans[a[x].id]+=Mod;
//cout<<endl;
}
int main()
{int T,i,j;
cin>>T;
for (i=;i<=T;i++)
{
scanf("%d%d%d",&a[i].n,&a[i].m,&a[i].a);
if (a[i].n>a[i].m) swap(a[i].n,a[i].m);
a[i].id=i;
}
mobius();
for (i=;i<=;i++) p[i]=i;
sort(p+,p+,cmp);
sort(a+,a+T+,cmp2);
for (i=;i<=T;i++)
solve(i);
for (i=;i<=T;i++)
printf("%d\n",ans[i]);
}

[SDOI2014]数表的更多相关文章

  1. BZOJ 3529: [Sdoi2014]数表 [莫比乌斯反演 树状数组]

    3529: [Sdoi2014]数表 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1399  Solved: 694[Submit][Status] ...

  2. 【BZOJ 3529】 [Sdoi2014]数表 (莫比乌斯+分块+离线+树状数组)

    3529: [Sdoi2014]数表 Description 有一张N×m的数表,其第i行第j列(1 < =i < =礼,1 < =j < =m)的数值为能同时整除i和j的所有 ...

  3. BZOJ 3259 [Sdoi2014]数表 (莫比乌斯反演 + 树状数组)

    3529: [Sdoi2014]数表 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 2321  Solved: 1187[Submit][Status ...

  4. 洛咕3312 [SDOI2014]数表

    洛咕3312 [SDOI2014]数表 终于独立写出一道题了...真tm开心(还是先写完题解在写的) 先无视a的限制,设\(f[i]\)表示i的约数之和 不妨设\(n<m\) \(Ans=\su ...

  5. 【BZOJ3529】[Sdoi2014]数表 莫比乌斯反演+树状数组

    [BZOJ3529][Sdoi2014]数表 Description 有一张N×m的数表,其第i行第j列(1 < =i < =礼,1 < =j < =m)的数值为能同时整除i和 ...

  6. 洛谷 P3312 [SDOI2014]数表 解题报告

    P3312 [SDOI2014]数表 题目描述 有一张\(N*M\)的数表,其第\(i\)行第\(j\)列(\(1\le i \le n\),\(1 \le j \le m\))的数值为能同时整除\( ...

  7. BZOJ3529 [Sdoi2014]数表 【莫比乌斯反演】

    3529: [Sdoi2014]数表 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 2151 Solved: 1080 [Submit][Status ...

  8. BZOJ[Sdoi2014]数表 莫比乌斯反演

    [Sdoi2014]数表 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 2383  Solved: 1229[Submit][Status][Disc ...

  9. 洛谷P3312 - [SDOI2014]数表

    Portal Solution 共\(T(T\leq2\times10^4)\)组测试数据.给出\(n,m(n,m\leq10^5),a(a\leq10^9)\),求\[ \sum_{i=1}^n\s ...

  10. bzoj [SDOI2014]数表 莫比乌斯反演 BIT

    bzoj [SDOI2014]数表 莫比乌斯反演 BIT 链接 bzoj luogu loj 思路 \[ \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}a*[f[ ...

随机推荐

  1. HIVE的常用操作(HQL)语句

    HIVE基本操作命令 创建数据库 >create database db_name; >create database if not exists db_name;//创建一个不存在的数据 ...

  2. ORA-03206,当表空间不够时,如何以添加数据文件的方式扩展表空间

    准备导入一个数据库,大约为33G,开始创建的空库表空间为自增到20G,结果自然不够,然后就开始自动扩展表空间大小 使用的如下语句 --自动扩展表空间大小 ALTER DATABASE DATAFILE ...

  3. gem devise配置

    Step1: Gemfile中加入gem 'devise' Step3: rails g devise:install 这一步执行完后命令行会提醒要手动进行如下动作: ================ ...

  4. TensorFlow-谷歌深度学习库 手把手教你如何使用谷歌深度学习云平台

    自己的电脑跑cnn, rnn太慢? 还在为自己电脑没有好的gpu而苦恼? 程序一跑一俩天连睡觉也要开着电脑训练? 如果你有这些烦恼何不考虑考虑使用谷歌的云平台呢?注册之后即送300美元噢-下面我就来介 ...

  5. ASP.NET MVC编程——单元测试

    1自动化测试基本概念 自动化测试分为:单元测试,集成测试,验收测试. 单元测试 检验被测单元的功能,被测单元一般为低级别的组件,如一个类或类方法. 单元测试要满足四个条件:自治的,可重复的,独立的,快 ...

  6. PM2使用心得

    PM2是node进程管理工具,可以利用它来简化很多node应用管理的繁琐任务,如性能监控.自动重启.负载均衡等,而且使用非常简单. 安装 npm install -g pm2 常用命令 $ npm i ...

  7. linux 进程间通信的3种高级方式及优缺点

    由于不同的进程运行在各自不同的内存空间中.一方对于变量的修改另一方是无法感知的.因此.进程之间的信息传递不可能通过变量或其它数据结构直接进行,只能通进程间通信来完成. 根据进程通信时信息量大小的不同, ...

  8. unity3D 知识点随手记

    最近闲来无事,记记unity3D相关的一些知识点吧,也当作笔记存储.转载请标明出处:http://www.cnblogs.com/zblade/ 1.unity是如何调用Start/Awake等相关函 ...

  9. 新概念英语(1-39)Don't drop it!

    新概念英语(1-39)Don't drop it! Where does Sam put the vase in the end ? A:What are you going to do with t ...

  10. [机器学习Lesson3] 梯度下降算法

    1. Gradient Descent(梯度下降) 梯度下降算法是很常用的算法,可以将代价函数J最小化.它不仅被用在线性回归上,也被广泛应用于机器学习领域中的众多领域. 1.1 线性回归问题应用 我们 ...