BZOJ3309DZY Loves Math

Posted RogerDTZ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ3309DZY Loves Math相关的知识,希望对你有一定的参考价值。

Time Limit: 5000 ms Memory Limit: 512 MB

Description

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

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

Solution

\[ \begin{aligned} ans&=\sum_{i=1}^a\sum_{j=1}^bf(gcd(i,j))\&=\sum_{x=1}^{min(n,m)}f(x)*sum(x) &sum(x)为x=gcd(i,j)的(i,j)对数,满足i和j在a和b范围内\&=\sum_{x=1}^{min(n,m)}f(x)\sum_{x|d}\mu(\frac dx)\lfloor\frac nd\rfloor\lfloor\frac md\rfloor\&=\sum_{x=1}^{min(n,m)}f(x)\sum_{k=1}^{\lfloor min(n,m)/x\rfloor}\mu(k)\lfloor\frac n{kx}\rfloor\lfloor\frac m{kx}\rfloor\&=\sum_{T=1}^{min(n,m)}\lfloor\frac nT\rfloor\lfloor\frac mT\rfloor\sum_{d|T}f(d)\mu(\frac Td)\&=\sum_{T=1}^{min(n,m)}\lfloor\frac nT\rfloor\lfloor\frac mT\rfloor g(T) &令g(x)=\sum\limits_{d|x}f(d)\mu(\frac xd) \end{aligned} \]

? 现在关键是求解\(g\)函数,完事后求\(g\)的前缀和,一样分块求\(ans\).

? (1)当\(x\)为质数时,\(g(x)=f(1)\mu(x)+f(x)\mu(1)=0+1=1\)

? (2)当筛到\(x=p*i\)时,分解质因数\(x=p_1^{q_1}p_2^{q_2}...p_k^{q_k}\)\(\frac xd=p_1^{a_1}p_2^{a_2}...p_k^{a_k}\),显然\(或a_i=0或1\),才能对\(g(x)\)有贡献,不然\(\mu({\frac xd})=0\). 现在只考虑满足\(或a_i=0或1\)的因数\(d\).
\[ \begin{aligned} g(x)&=\sum_{d|x}f(d)\mu(\frac xd)\&=f(x)\sum_{d|x且f(d)=f(x)} \mu(\frac xd)+[f(x)-1]\sum_{d|x且f(d)\ne f(x)}\mu(\frac xd)\&=-\sum_{d|x且f(d)\ne f(x)}\mu(\frac xd) \end{aligned} \]
? 要满足\(f(d)\ne f(x)\),所有\(q_i=f(x)\)\(p_i\)的指数在\(d\)中都要变成\(q_i-1\).

? 1° 如果所有\(q_i=f(x)\),那么\(a_i\)全部取1,则\(g(x)=-\mu(p_1p_2...p_k)=-(-1)^k=(-1)^{k+1}\),这里有个特殊情况,如果\(i\)\(p\)的完全平方数,即\(i=p^{a_i}\),(这里的\(a\)是最后提到的那个\(a\)数组),那么\(x=p^{a_i+1}\),则\(g(x)=-\mu(p)=1\)

? 2° 否则若存在\(q_i\ne f(x)\)\(g(x)=0\).

? 记\(A=\{i|q_i=f(x)\},B=\{i|q_i\ne f(x)\}\).

? 对于\(A\)中的\(i\)\(a_i\)必须取1,而\(B\)中的\(a_i\)取0或1都可以,那么
\[ \begin{aligned} g(x)&=-\sum\mu((\prod_{i\in A}p_i)*(\prod_{j\in B}(p_j或1))\&=-\mu(\prod_{i\in A}p_i)\sum\mu(\prod_{j\in B}(p_j或1))\&=-(-1)^{|A|}*0&\prod_{i\in B}(p_j或1)有奇数个质数和偶数个质数的情况次数一样,正负抵消\\ &=0 &大快人心 \end{aligned} \]
?

? 线性筛时,维护一个\(a_i\)表示\(i\)的最小质因子\(p_{min}\)的指数,\(b_i\)表示\(p_{min}^{a_i}\).

? 由于每次循环的\(p\)都是\(x\)的最小质因子,故每次更新时比较\(a_i\)\(a_x\)是否相同,如果相同就更新,如果不相同直接等于0,这样就可以保证每一个数\(x\)如果存在质因子指数不同的情况,\(g(x)\)立即等于0. 详情见代码.

#include <cstdio>
using namespace std;
typedef long long ll;
const int N=1e7+1;
int vis[N],lis[N],cnt;
ll g[N],a[N],b[N];
inline void swap(int &x,int &y){int t=x;x=y;y=t;}
inline int min(int x,int y){return x<y?x:y;}
void init(){
    for(int i=2;i<N;i++){
        if(!vis[i]){
            lis[++cnt]=i;
            a[i]=1; b[i]=i;
            g[i]=1;
        }
        for(int j=1;j<=cnt&&i*lis[j]<N;j++){
            int x=i*lis[j],p=lis[j];
            vis[x]=1;
            if(i%p==0){
                //d是i去除p后的数,i=d*p^ai, x=d*p^(ai+1) 故ax=ai+1,bx相应乘上p
                a[x]=a[i]+1;    
                b[x]=b[i]*p;
                int d=i/b[i];
                if(d==1) g[x]=1; //特殊情况(边界情况)i是p的幂 
                else g[x]=(a[x]==a[d])?-g[d]:0;  //若x满足所有指数相同,g(x)=g(d)乘上-1,否则为0
                break;
            }
            a[x]=1; b[x]=p;
            g[x]=a[i]==1?-g[i]:0; //原理同上
        }
    }
    for(int i=2;i<N;i++) g[i]+=g[i-1];
}
int main(){
    freopen("input.in","r",stdin);
    init();
    int T,a,b;
    ll ans;
    scanf("%d",&T);
    while(T--){
        scanf("%d%d",&a,&b);
        if(a>b) swap(a,b);
        ans=0;
        for(int i=1,j;i<=a;i=j+1){
            j=min(a/(a/i),b/(b/i));
            ans+=1LL*(a/i)*(b/i)*(g[j]-g[i-1]);
        }
        printf("%lld\n",ans);
    }
    return 0;
}

以上是关于BZOJ3309DZY Loves Math的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ3309: DZY Loves Math

[BZOJ3309]DZY Loves Math

Bzoj3309 DZY Loves Math

BZOJ3309DZY Loves Math

bzoj3309: DZY Loves Math

BZOJ3309: DZY Loves Math 莫比乌斯反演优化