【SDOI2014】【BZOJ3529】数表

Description

有一张N×m的数表,其第i行第j列(1 < =i < =礼。1 < =j < =m)的数值为

能同一时候整除i和j的全部自然数之和。给定a,计算数表中不大于a的数之和。

Input

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

Output

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

Sample Input

2

4 4 3

10 10 5

Sample Output

20

148

HINT

1 < =N.m < =10^5 。 1 < =Q < =2×10^4

Source

Round 1 Day 1

在反演上的处理和DzyLovesMath1是相似的属于同一类题目

问题在于询问有10^4个所以要BIT维护一下前缀和

推公式过程懒得放了…贴个Po姐课件的图吧

(从未见过如此丧病的反演..反演还要加数据结构T_T

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define MAXN 100010
#define lowbit(x)   (x&(-x))
#define LL long long
#define MAXINT (0x7fffffff)
#define GET (ch>=‘0‘&&ch<=‘9‘)
using namespace std;
int T,maxn;
int c[MAXN];
bool not_prime[MAXN];
int prime[MAXN],mu[MAXN]={0,1},top;
int ans[MAXN];
struct Query
{
    int n,m,a,id;
    bool operator <(const Query& t)const    {return a<t.a;}
}q[MAXN];
struct num
{
    int a,b;
    bool operator <(const num& x)const  {return a==x.a?b<x.b:a<x.a;}
}f[MAXN];
void init()
{
    for (int i=2;i<=maxn;i++)
    {
        if (!not_prime[i])  prime[++top]=i,mu[i]=-1;
        for (int j=1;j<=top&&i*prime[j]<=maxn;j++)
        {
            not_prime[i*prime[j]]=1;mu[i*prime[j]]=-mu[i];
            if (i%prime[j]==0)  {mu[i*prime[j]]=0;break;}
        }
    }
    for (int i=1;i<=maxn;i++)
    {
        for (int j=i;j<=maxn;j+=i)  f[j].a+=i;
        f[i].b=i;
    }
}
void add(int x,int delta)   {for (int i=x;i<=maxn;i+=lowbit(i)) c[i]+=delta;}
int query(int x)
{
    int ret=0;
    for (int i=x;i;i-=lowbit(i))    ret+=c[i];
    return ret;
}
void in(int &x)
{
    char ch=getchar();x=0;int flag=1;
    while (!GET)    flag=(ch==‘-‘)?

-1:1,ch=getchar();
    while (GET) x=x*10+ch-‘0‘,ch=getchar();x*=flag;
}
void calc(int x)
{
    int id=q[x].id,n=q[x].n,m=q[x].m,last=0,t=min(n,m);
    for (int i=1;i<=t;i=last+1)
    {
        last=min(n/(n/i),m/(m/i));
        ans[id]+=(n/i)*(m/i)*(query(last)-query(i-1));
    }
}
int main()
{
    in(T);int now=0;
    for (int i=1;i<=T;i++)  in(q[i].n),in(q[i].m),in(q[i].a),q[i].id=i,maxn=max(maxn,max(q[i].n,q[i].m));
    init();sort(q+1,q+T+1);sort(f+1,f+maxn+1);
    for (int i=1;i<=T;i++)
    {
        while (now+1<=maxn&&f[now+1].a<=q[i].a)
        {
            now++;
            for (int j=f[now].b;j<=maxn;j+=f[now].b)    add(j,f[now].a*mu[j/f[now].b]);
        }
        calc(i);
    }
    for (int i=1;i<=T;i++)  printf("%d\n",ans[i]&MAXINT);
}
时间: 2024-10-10 11:02:39

【SDOI2014】【BZOJ3529】数表的相关文章

【BZOJ3529】【SDOI2014】 数表

Time Limit: 10 Sec Memory Limit: 512 MB Description ? 有一张\(n×m\)的数表,其第i行第j列(\(,1 \le i \leq n,1 \le j \le m\))的数值为 能同时整除\(i\)和\(j\)的所有自然数之和.给定\(a\),计算数表中不大于\(a\)的数之和. Input ? 输入包含多组数据. ? 输入的第一行一个整数\(Q\)表示测试点内的数据组数,接下来Q行,每行三个整数\(,,n,m,a\)(\(|a| < =10^

[bzoj3529]数表

记f(n)表示n的约数和,先不考虑a的限制,那么即求$\sum_{i=1}^{n}\sum_{j=1}^{m}f(gcd(i,j))$枚举$d=gcd(i,j)$,即$\sum_{d=1}^{n}f(d)\sum_{g|d}(n/gd)(m/gd)\mu(g)$(后面就是指公约数为d的数对个数)令$t=gd$,即$\sum_{t=1}^{n}(n/t)(m/t)\sum_{d|t}f(d)\cdot \mu(t/d)$,对后半部分预处理(先线性筛出f和$\mu$,然后$o(nln(n))$求)+

屯题计划

感觉lxt一天到晚就是在浪啊浪, 毫无斗志, 颓废得不得了, 每天看小说玩手机到三四点然后整个人都是乱七八糟的. 不行不行我要振作起来了! 从最开始学语言到现在都快两年过去了 T T , 代码能力还是渣成这样简直不能看 T T 觉得应该学学zj爷们屯题. 加油! (题目是直接从劼很久以前的几篇屯题计划里边搬过来的我之前做过的题就删掉了 [BZOJ1822][JSOI2010]Frozen Nova 冷冻波 很水的网络流加计算几何, 然而计算几何部分非常莫名奇妙, 题目应该是判断一个圆是否与一个线

莫比乌斯反演部分套路

\[ [gcd(i,j)==d]\Rightarrow[\frac {gcd(i,j)}d==1]\Rightarrow\sum\limits_{k|\frac {gcd(i,j)}d}\mu(k) \] \[ \begin{split} \sum_{i=1}^n\sum_{j=1}^m[\gcd(i,j)==x]=\sum_{d=1}^{\lfloor\frac nx \rfloor}\mu(d)\lfloor\frac n{xd}\rfloor\lfloor\frac m{xd}\rfloo

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

[BZOJ3529][Sdoi2014]数表 Description 有一张N×m的数表,其第i行第j列(1 < =i < =礼,1 < =j < =m)的数值为能同时整除i和j的所有自然数之和.给定a,计算数表中不大于a的数之和. Input 输入包含多组数据.    输入的第一行一个整数Q表示测试点内的数据组数,接下来Q行,每行三个整数n,m,a(|a| < =10^9)描述一组数据. Output 对每组数据,输出一行一个整数,表示答案模2^31的值. Sample I

[bzoj3529][Sdoi2014]数表_树状数组_莫比乌斯反演

数表 bzoj-3529 Sdoi-2014 题目大意:n*m的数表,第i行第j列的数是同时整除i和j的所有自然数之和.给定a,求数表中所有不超过a的和. 注释:$1\le n,m \le 10^5$. 想法:我们先不考虑那个a的限制:我们设f(i)表示整除i的自然数之和. $\sum\limits_{i=1}^n\sum\limits_{j=1}^m f(gcd(i,j))$ $\sum\limits_{i=1}^n\sum\limits_{j=1}^m f(d)\cdot [gcd(i,j)

[BZOJ3529][Sdoi2014]数表

试题描述 有一张N×m的数表,其第i行第j列(1 < =i < =n,1 < =j < =m)的数值为能同时整除i和j的所有自然数之和.给定a,计算数表中不大于a的数之和. 输入 输入包含多组数据.输入的第一行一个整数Q表示测试点内的数据组数,接下来Q行,每行三个整数n,m,a(|a| < =10^9)描述一组数据. 输出 对每组数据,输出一行一个整数,表示答案模2^31的值. 输入示例 2 4 4 3 10 10 5 输出示例 20 148 数据规模及约定 1 < =

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

Description 有一张N×m的数表,其第i行第j列(1 < =i < =礼,1 < =j < =m)的数值为 能同时整除i和j的所有自然数之和.给定a,计算数表中不大于a的数之和. Input 输入包含多组数据.     输入的第一行一个整数Q表示测试点内的数据组数,接下来Q行,每行三个整数n,m,a(|a| < =10^9)描述一组数据. Output 对每组数据,输出一行一个整数,表示答案模2^31的值. Sample Input 2 4 4 3 10 10 5

[bzoj3529] [洛谷P3312] [Sdoi2014] 数表

Description 有一张n×m的数表,其第i行第j列(1 < =i < =n,1 < =j < =m)的数值为 能同时整除i和j的所有自然数之和.给定a,计算数表中不大于a的数之和. Input 输入包含多组数据. 输入的第一行一个整数Q表示测试点内的数据组数,接下来Q行,每行三个整数n,m,a(|a| < =10^9)描述一组数据. Output 对每组数据,输出一行一个整数,表示答案模2^31的值. Sample Input 2 4 4 3 10 10 5 Samp