BZOJ 3309: 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

分析

先%%%POPOQQQ
然后 扔链接http://blog.csdn.net/popoqqq/article/details/42122413

代码

#include <bits/stdc++.h>

#define N 10001000

int tot;
int a[N],prime[N],g[N],p[N];
bool notPrime[N];

void getMu()
{
    for (int i = 2; i < N; i++)
    {
        if (!notPrime[i])
        {
            prime[++tot] = i;
            a[i] = 1;
            p[i] = i;
            g[i] = 1;
        }

        for (int j = 1; prime[j] * i < N && j <= tot; j++)
        {
            notPrime[prime[j] * i] = 1;
            if (i % prime[j] == 0)
            {
                a[prime[j] * i] = a[i] + 1;
                p[prime[j] * i] = p[i] * prime[j];
                int tmp = i / p[i];
                if (tmp == 1)
                    g[prime[j] * i] = 1;
                    else g[prime[j] * i] = (a[tmp] == a[prime[j] * i] ? - g[tmp] : 0);
                break;
            }
            a[prime[j] * i] = 1;
            p[prime[j] * i] = prime[j];
            g[prime[j] * i] = (a[i] == 1 ? -g[i] : 0);
        }
    }

    for (int i = 1; i < N; i++)
        g[i] += g[i - 1];
}

long long slove(int n,int m)
{
    long long ans = 0;
    if (n > m)
        std::swap(n,m);
    for (int i = 1,last; i <= n; i = last + 1)
    {
        last = std::min(n / (n / i),m / (m / i));
        ans += (long long)(n / i) * (m / i) * (g[last] - g[i - 1]);
    }
    return ans;
}

int main()
{
    getMu();
    int T,n,m;
    scanf("%d",&T);
    while (T--)
    {
        scanf("%d%d",&n,&m);
        printf("%lld\n",slove(n,m));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值