BZOJ 2693 jzptab

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

题解:

考虑把lcm转化成gcd
那答案就是

然后神奇的设:

就有:

一样可以枚举

的取值,这是O(√n)的;

然后求f(x,y);

大概证明了一下= =

线性筛之后也可以O(√n)求出f(x,y)
总复杂度O(n),常数略大。。

这题显然是卡O(n)过不了呗
那就还得优化


预处理这玩意


然后O(√n)就搞出来啦!



“积性函数的约数和也是积性函数”  ->好像比较显然?
所以g(D)是积性函数
线性筛裸上就好

#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#define ll long long
const ll Mod=100000009;
ll g[10010005],p[10010005],sum[10010005];
bool mark[10010005];
ll read(){
    ll t=0,f=1;char ch=getchar();
    while (ch<‘0‘||ch>‘9‘){if (ch==‘-‘) f=-1;ch=getchar();}
    while (‘0‘<=ch&&ch<=‘9‘){t=t*10+ch-‘0‘;ch=getchar();}
    return t*f;
}
void init(){
    g[1]=sum[1]=1;
    for (ll i=2;i<10010000;i++){
        if (!mark[i]){
            p[++p[0]]=i;
            g[i]=(ll)((i-i*i)%Mod+Mod)%Mod;
        }
        for (ll j=1;j<=p[0]&&p[j]*i<=10010000;j++){
            mark[i*p[j]]=1;
            if (i%p[j]==0){
                g[i*p[j]]=g[i]*(p[j])%Mod;
                break;
            }else
            g[i*p[j]]=g[i]*g[p[j]]%Mod;
        }
        sum[i]=sum[i-1]+g[i];
    }
}
ll F(ll x,ll y){
    return (((x*(x+1)/2LL)%Mod)*((y*(y+1)/2LL)%Mod))%Mod;
}
int main(){
    init();int T=read();
    while (T--){
        ll n=read(),m=read();
        if (n>m) std::swap(n,m);
        ll j;ll ans=0;
        for (ll i=1;i<=n;i=j+1){
             j=std::min(n/(n/i),m/(m/i));
             ans+=((sum[j]-sum[i-1]%Mod+Mod)%Mod)*F(n/i,m/i);
             ans%=Mod;
        }
        printf("%lld\n",ans);
    }
}
时间: 2024-07-31 14:26:36

BZOJ 2693 jzptab的相关文章

【莫比乌斯反演】关于Mobius反演与lcm的一些关系与问题简化(BZOJ 2154 crash的数字表格&amp;&amp;BZOJ 2693 jzptab)

BZOJ 2154 crash的数字表格 Description 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b)表示能同时被a和b整除的最小正整数.例如,LCM(6, 8) = 24.回到家后,Crash还在想着课上学的东西,为了研究最小公倍数,他画了一张N*M的表格.每个格子里写了一个数字,其中第i行第j列的那个格子里写着数为LCM(i, j).一个4*5的表格如下: 1 2 3 4 5 2 2 6 4

bzoj 2693: jzptab 线性筛积性函数

2693: jzptab Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 444  Solved: 174[Submit][Status][Discuss] Description Input 一个正整数T表示数据组数 接下来T行 每行两个正整数 表示N.M Output T行 每行一个整数 表示第i组数据的结果 Sample Input 1 4 5 Sample Output 122 HINT T <= 10000 N, M<=10000000

BZOJ 2693: jzptab [莫比乌斯反演 线性筛]

2693: jzptab Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1194  Solved: 455[Submit][Status][Discuss] Description Input 一个正整数T表示数据组数 接下来T行 每行两个正整数 表示N.M Output T行 每行一个整数 表示第i组数据的结果 Sample Input 1 4 5 Sample Output 122 HINT T <= 10000 N, M<=1000000

BZOJ 2693: jzptab( 莫比乌斯反演 )

速度居然#2...目测是因为我没用long long.. 求∑ lcm(i, j) (1 <= i <= n, 1 <= j <= m) 化简之后就只须求f(x) = x∑u(d)*d (d | x) 然后就是分块了... ------------------------------------------------------------------- #include<bits/stdc++.h> using namespace std; typedef long

BZOJ 2693 jzptab 【莫比乌斯反演】

Description Hint T <= 10000 N, M<=10000000 Solution 和 BZOJ 2154 数字表格 几乎一样,只不过询问变成多组,之前的复杂度又过不了了 依旧写开答案 又有两个枚举量 我们尝试改变求和指标+前缀和继续减掉一个枚举量 于是就有了 对于这个东西我们定义它为 h ( D ) 使可以进行前缀和预处理的 考虑枚举 i 和 i 的倍数 然而这样的处理显然也是接受不了的 似乎只有O(n)的复杂度才可能接受 能不能把 h 放到线性筛之中处理出来呢 对于一个

2693: jzptab - BZOJ

Description Input 一个正整数T表示数据组数接下来T行 每行两个正整数 表示N.MOutput T行 每行一个整数 表示第i组数据的结果Sample Input 1 4 5 Sample Output 122 HINT T <= 10000 N, M<=10000000 题解君:http://hi.baidu.com/mikeni2006/item/b4f78a4520de9bab61d7b985 看了一上午才看懂,最后终于在lazycal的帮助下想出来了 我们需要先预处理出那

【BZOJ】2693: jzptab

http://www.lydsy.com/JudgeOnline/problem.php?id=2693 题意:求\sum_{i=1}^{n} \sum_{j=1}^{m} lcm(i, j), n,m<=1e7, 多个询问q<=10000$$ #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e7+10, MD=100000009; int p[N], pcnt, mx

Crash的数字表格 BZOJ 2154 / jzptab BZOJ 2693

jzptab [问题描述] 求: 多组询问 [输入格式] 一个正整数T表示数据组数 接下来T行 每行两个正整数 表示N.M [输出格式] T行 每行一个整数 表示第i组数据的结果 [样例输入] 1 4 5 [样例输出] 122 [数据范围] T <= 10000 N, M<=10000000 题解: 即后面那个部分为 H[T],H[T]是积性函数,求详细证明的话将T和d展开为质因数次幂相乘的形式,考虑线性筛中枚举的质数与被筛数的性质即可 1 #include<cmath> 2 #i

bzoj 2693

收获: 1.积性函数的积也是积性函数,基本的积性函数:常数函数,正比例函数,欧拉函数,Mobius函数,积性函数一般都知道表达式,所以一般都可以在线性筛时搞定. 2.遇到整除求和时,这个东西就已经是最简了,所以可以考虑提出它,然后尝试搞后边的东西的前缀和,如果可以成功,那么就可以在O(sqrt(n))的复杂度做了. 1 /************************************************************** 2 Problem: 2693 3 User: i