bzoj3309: DZY Loves Math【莫比乌斯反演+积性函数】

Description

对于正整数n,定义f(n)为n所含质因子的最大幂指数。例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0。
给定正整数a,b,求sigma(sigma(f(gcd(i,j)))) (i=1..a, j=1..b)。

Input

第一行一个数T,表示询问数。
接下来T行,每行两个数a,b,表示一个询问。

Output

对于每一个询问,输出一行一个非负整数作为回答。

Sample Input

4

7558588 9653114

6514903 4451211

7425644 1189442

6335198 4957

Sample Output
35793453939901

14225956593420

4332838845846

15400094813

HINT

【数据规模】

T<=10000

1<=a,b<=10^7

解题思路:

i=1nj=1mf(gcd(i,j) ∑ i = 1 n ∑ j = 1 m f ( g c d ( i , j )
=df(d)i=1nj=1m[gcd(i,j)=d] = ∑ d f ( d ) ∑ i = 1 n ∑ j = 1 m [ g c d ( i , j ) = d ]
=df(d)i=1ndj=1md[gcd(i,j)=1] = ∑ d f ( d ) ∑ i = 1 ⌊ n d ⌋ ∑ j = 1 ⌊ m d ⌋ [ g c d ( i , j ) = 1 ]
=df(d)i=1ndj=1mdp|i,p|jμ(p) = ∑ d f ( d ) ∑ i = 1 ⌊ n d ⌋ ∑ j = 1 ⌊ m d ⌋ ∑ p | i , p | j μ ( p )
=df(d)pμ(p)i=1npdj=1mpd = ∑ d f ( d ) ∑ p μ ( p ) ∑ i = 1 ⌊ n p d ⌋ ∑ j = 1 ⌊ m p d ⌋
=Ti=1nTj=1mTd|Tμ(d)f(Td) = ∑ T ∑ i = 1 ⌊ n T ⌋ ∑ j = 1 ⌊ m T ⌋ ∑ d | T μ ( d ) f ( T d )

g(x)=d|xμ(d)f(xd) g ( x ) = ∑ d | x μ ( d ) f ( x d ) ,考虑如何快速求 g(x) g ( x )

首先 g(1)=0 g ( 1 ) = 0 ,否则设 x=isptiititi+1 x = ∏ i s p i t i , t i ≤ t i + 1 ,那么

g(x)=c1=0t1c2=0t2...cs=0tsμ(pcii)f(pticii) g ( x ) = ∑ c 1 = 0 t 1 ∑ c 2 = 0 t 2 . . . ∑ c s = 0 t s μ ( ∏ p i c i ) f ( ∏ p i t i − c i )
g(x)=c1=01c2=01...cs=01μ(pci=0i)f(pticii) g ( x ) = ∑ c 1 = 0 1 ∑ c 2 = 0 1 . . . ∑ c s = 0 1 μ ( ∏ p i c i = 0 ) f ( ∏ p i t i − c i )

t1<ts t 1 < t s ,则
g(x)=c2=01...cs=01μ(pcii)f(pt11pticii)+ g ( x ) = ∑ c 2 = 0 1 . . . ∑ c s = 0 1 μ ( ∏ p i c i ) f ( p 1 t 1 ∏ p i t i − c i ) +
c2=01...cs=01μ(p1pcii)f(pt111pticii) ∑ c 2 = 0 1 . . . ∑ c s = 0 1 μ ( p 1 ∏ p i c i ) f ( p 1 t 1 − 1 ∏ p i t i − c i )
=c2=01...cs=01μ(pcii)f(pt11pticii) = ∑ c 2 = 0 1 . . . ∑ c s = 0 1 μ ( ∏ p i c i ) f ( p 1 t 1 ∏ p i t i − c i ) −
c2=01...cs=01μ(pcii)f(pt111pticii)=0 ∑ c 2 = 0 1 . . . ∑ c s = 0 1 μ ( ∏ p i c i ) f ( p 1 t 1 − 1 ∏ p i t i − c i ) = 0

否则 t1=t2=...=ts t 1 = t 2 = . . . = t s
g(x)=ci1μ(pcii)t1+μ(pi)(t11) g ( x ) = ∑ ∏ c i ≠ 1 μ ( ∏ p i c i ) t 1 + μ ( ∏ p i ) ( t 1 − 1 )
=c1=01c2=01...cs=01μ(pcii)t1μ(pi) = ∑ c 1 = 0 1 ∑ c 2 = 0 1 . . . ∑ c s = 0 1 μ ( ∏ p i c i ) t 1 − μ ( ∏ p i )
=i=0s(1)iCisμ(pi) = ∑ i = 0 s ( − 1 ) i C s i − μ ( ∏ p i )
=μ(pi)=(1)s+1 = − μ ( ∏ p i ) = ( − 1 ) s + 1

这样就很好筛了,记录每个数最小质因数的幂数 t(x) t ( x ) 即除掉所有最小质因数后的数 last(x) l a s t ( x ) 即可。

时间复杂度为 O(nTn) O ( n − T n )

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int getint()
{
    int i=0,f=1;char c;
    for(c=getchar();(c!='-')&&(c<'0'||c>'9');c=getchar());
    if(c=='-')c=getchar(),f=-1;
    for(;c>='0'&&c<='9';c=getchar())i=(i<<3)+(i<<1)+c-'0';
    return i*f;
}
const int N=10000005;
int pn,pri[N],t[N],last[N],g[N];
void sieve()
{
    for(int i=2;i<N;i++)
    {
        if(!t[i])pri[++pn]=i,t[i]=last[i]=g[i]=1;
        for(int j=1;j<=pn;j++)
        {
            ll k=i*pri[j];
            if(k>=N)break;
            if(i%pri[j]==0)
            {
                last[k]=last[i];
                t[k]=t[i]+1;
                if(last[k]==1)g[k]=1;
                else g[k]=t[k]==t[last[k]]?-g[last[k]]:0;
                break;
            }
            last[k]=i,t[k]=1,g[k]=(t[i]==1?-g[i]:0);
        }
    }
    for(int i=2;i<N;i++)g[i]+=g[i-1];
}
ll F(int n,int m)
{
    ll res=0;
    if(n>m)swap(n,m);
    for(int i=1,j;i<=n;i=j+1)
    {
        j=min(n/(n/i),m/(m/i));
        res+=1ll*(n/i)*(m/i)*(g[j]-g[i-1]);
    }
    return res;
}
int main()
{
    //freopen("lx.in","r",stdin);
    sieve();
    for(int T=getint();T;T--)
    {
        int n=getint(),m=getint();
        printf("%lld\n",F(n,m));
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值