zoukankan      html  css  js  c++  java
  • bzoj 3994: [SDOI2015]约数个数和

    3994: [SDOI2015]约数个数和

    Time Limit: 20 Sec  Memory Limit: 128 MB
    Submit: 1164  Solved: 811
    [Submit][Status][Discuss]

    Description

     设d(x)为x的约数个数,给定N、M,求  
     

     

    Input

    输入文件包含多组测试数据。

    第一行,一个整数T,表示测试数据的组数。
    接下来的T行,每行两个整数N、M。
     

    Output

     T行,每行一个整数,表示你所求的答案。

     

    Sample Input

    2
    7 4
    5 6

    Sample Output

    110
    121

    HINT

     1<=N, M<=50000


    1<=T<=50000
     
    #include<iostream>
    #include<cstdio>
    #define maxn 50010
    using namespace std;
    int p[maxn],cnt,tot;
    bool v[maxn];
    long long n,m,s[maxn],mu[maxn],f[maxn];
    int main(){
        freopen("Cola.txt","r",stdin);
        int T;scanf("%d",&T);
        s[1]=mu[1]=1;
        for(int i=2;i<maxn;i++){//求出莫比乌斯函数和前缀和 
            if(!v[i]){v[i]=1;p[++p[0]]=i;mu[i]=-1;}
            for(int j=1;j<=p[0];j++){
                if(p[j]*i>=maxn)break;
                v[p[j]*i]=1;
                if(i%p[j]==0){mu[i*p[j]]=0;break;}
                else mu[i*p[j]]=-mu[i];
            }
            s[i]=s[i-1]+mu[i];
        }
        for(int i=1;i<maxn;i++)
            for(int j=1,k;j<=i;j=k+1){
                k=i/(i/j);
                f[i]+=1LL*(k-j+1)*(i/j);
            }
        while(T--){
            scanf("%lld%lld",&n,&m);
            if(n>m)swap(n,m);
            long long ans=0;
            for(int i=1,j;i<=n;i=j+1){//除法分块 
                j=min(n/(n/i),m/(m/i));
                ans+=f[n/i]*f[m/i]*(s[j]-s[i-1]);
            }
            printf("%lld
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    leetcode18
    CSS 1. 选择器
    HTML
    练习题|MySQL
    练习题||并发编程
    第八章| 3. MyAQL数据库|Navicat工具与pymysql模块 | 内置功能 | 索引原理
    mysql练习
    第八章| 2. MySQL数据库|数据操作| 权限管理
    第八章| 1. MySQL数据库|库操作|表操作
    第七章|7.4并发编程| I/O模型
  • 原文地址:https://www.cnblogs.com/thmyl/p/8127313.html
Copyright © 2011-2022 走看看