hdu 6069 Counting Divisors

题意:给出求L,R 之间的数的K次方的因子数之和

思路:打表求出1~10^6之间的素数,枚举[L,R]之间素数的倍数,然后按算数基本定理求出因子个数和。处理过后[L,R]之间的数要么是1,要么是一个素数,再次根据算数基本定理计算因子个数和。

#include<bits/stdc++.h>
#define MAXSIZE 1000015
#define INF 0x3f3f3f3f
#define LL long long
#define MOD 998244353
using namespace std;

bool vis[MAXSIZE];
LL p[MAXSIZE],a[MAXSIZE],b[MAXSIZE];
int n,cns;

void GetPrime()
{
    cns = 1;
    memset(vis,false,sizeof(vis));
    vis[1] = true;
    for(int i=2;i<MAXSIZE;i++)
    {
        if(vis[i] == false)
        {
            p[cns++] = i;
            for(int j=i*2;j<MAXSIZE;j+=i)
            {
                vis[j] = true;
            }
        }
    }
}

int main()
{
    GetPrime();
    LL l,r,k,ans;
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%lld%lld%lld",&l,&r,&k);
        ans = 0;
        for(LL i=l;i<=r;i++)
        {
            a[i-l] = i; //记录这个数的值
            b[i-l] = 1; //记录正因子个数
        }

        for(int i=1;p[i]*p[i]<=r && i<=cns;i++) //枚举素数
        {
            LL j = l/p[i] + (l%p[i]!=0);
            for(j=j*p[i];j<=r;j+=p[i]) //枚举素数的倍数
            {
                LL sum = 0;
                while(a[j-l]%p[i] == 0)
                {
                    sum++;
                    a[j-l]/=p[i];
                }
                b[j-l] = (b[j-l]*((sum*k%MOD + 1)%MOD))%MOD;
            }
        }

        for(LL i=l;i<=r;i++)
        {
            if(a[i-l] == 1)
                ans = (ans+b[i-l])%MOD;
            else
                ans = (ans+b[i-l]*(k+1)%MOD)%MOD;
        }

        printf("%lld\n",ans);
    }
    return 0;
}

时间: 2024-10-10 00:50:15

hdu 6069 Counting Divisors的相关文章

HDU 6069 Counting Divisors —— 2017 Multi-University Training 4

Counting Divisors Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)Total Submission(s): 2599    Accepted Submission(s): 959 Problem Description In mathematics, the function d(n) denotes the number of divisors of p

hdu 6069 Counting Divisors(求因子的个数)

Counting Divisors Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)Total Submission(s): 3170    Accepted Submission(s): 1184 Problem Description In mathematics, the function d(n) denotes the number of divisors of

第四场 hdu 6069 Counting Divisors (逆向思维)

http://acm.hdu.edu.cn/showproblem.php?pid=6069 题目大意:求 i 从 l 到 r 中 i 的k次方的因子数之和. 解题思路:我们可以知道一个数有因子,则这个数的因子一定是若干个质数因子排列组合得到的.我们首先要得到10^6中的素数,然后它的因子数量是 相同质因子数量+1 的乘积,所以我们能够想到从 l 到 r 枚举每一个i得到其 相同质因子数量+1 的乘积 的累加和.但是这样在枚举时会发现有一些质数是并不是所求的 i 的因子,所以我们应该反过来考虑,

HDU 6069 Counting Divisors(唯一分解定理+因子数)

http://acm.hdu.edu.cn/showproblem.php?pid=6069 题意: 思路: 根据唯一分解定理,$n={a_{1}}^{p1}*{a2_{}}^{p2}...*{a_{m}}^{pm}$,那么n的因子数就是 n的k次方也是一样的,也就是p前面乘个k就可以了. 先打个1e6范围的素数表,然后枚举每个素数,在[ l , r ]寻找该素数的倍数,将其分解质因数. 到最后如果一个数没有变成1,那就说明这个数是大于1e6的质数.(它就只有0和1两种选择) 1 #includ

HDU 6069 Counting Divisors(区间素数筛法)

题意:...就题面一句话 思路:比赛一看公式,就想到要用到约数个数定理 约数个数定理就是: 对于一个大于1正整数n可以分解质因数: 则n的正约数的个数就是 对于n^k其实就是每个因子的个数乘了一个K 然后现在就变成了求每个数的每个质因子有多少个,但是比赛的时候只想到sqrt(n)的分解方法,总复杂度爆炸,就一直没过去,然后赛后看官方题解感觉好妙啊! 通过类似素数筛法的方式,把L - R的质因子给分解,就可以在O(nlogn)的时间之内把所以的数给筛出来. 代码: /** @xigua */ #i

Counting Divisors HDU - 6069

Counting Divisors HDU - 6069 题意:给定区间[a,b]和k,求xk有多少因子(x属于[a,b]),求和. 题解:http://blog.csdn.net/zlh_hhhh/article/details/76680641 a.b最大可达到1e12,但是b-a<1e6. 一开始愚蠢的一个一个分解然后去求有多少因子然后求和,范围那么大裸裸的超时啊! 可以枚举素数,对每一个素数,把区间内所有可以分解的进行分解. 最后再求和. 1 #include <bits/stdc++

hdu 1396 Counting Triangles (递推)

Counting Triangles Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 2012    Accepted Submission(s): 966 Problem Description Given an equilateral triangle with n the length of its side, program to

HDU 6069

Counting Divisors Problem Description In mathematics, the function d(n) denotes the number of divisors of positive integer n. For example, d(12)=6 because 1,2,3,4,6,12 are all 12's divisors. In this problem, given l,r and k, your task is to calculate

HDU 1264 Counting Squares (线段树-扫描线-矩形面积并)

Problem A : Counting Squares From:HDU, 1264 Problem Description Your input is a series of rectangles, one per line. Each rectangle is specified as two points(X,Y) that specify the opposite corners of a rectangle. All coordinates will be integers in t