七夕节 HDU - 1215 (唯一分解 素数筛法 因子之和加强版)

七夕节 HDU - 1215

题目链接:https://vjudge.net/problem/HDU-1215#author=0

题目:

七夕节那天,月老来到数字王国,他在城门上贴了一张告示,并且和数字王国的人们说:"你们想知道你们的另一半是谁吗?那就按照告示上的方法去找吧!"
人们纷纷来到告示前,都想知道谁才是自己的另一半.告示如下:

数字N的因子就是所有比N小又能被N整除的所有正整数,如12的因子有1,2,3,4,6.

你想知道你的另一半吗?

Input输入数据的第一行是一个数字T(1<=T<=500000),它表明测试数据的组数.然后是T组测试数据,每组测试数据只有一个数字N(1<=N<=500000).

Output对于每组测试数据,请输出一个代表输入数据N的另一半的编号.

Sample Input

3
2
10
20

Sample Output

1
8
22思路:这道题数据有点弱,可以直接取巧打个素数表将因子累加即可,但是如果数据很大的话,就要将其优化,就要采取唯一分解的这个算术基本算法所以要利用其中的因子和来计算:

代码如下:

//
// Created by hanyu on 2019/8/10.
//
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
#include<cmath>
#include<map>
#include<stack>
using namespace std;
const int maxn=1e6+1000;
int prime[maxn],isprime[maxn];
void getp()
{
    memset(isprime,1,sizeof(isprime));
    int limit=(int)sqrt(maxn*1.0);
    for(int i=2;i<limit;++i)
    {
        if(isprime[i])
        {
            for(int j=i*i;j<maxn;j+=i)
            {
                isprime[j]=0;
            }
        }
    }
    for(int i=2,j=0;i<maxn;i++)
        if(isprime[i])
            prime[j++]=i;
}
int fenjie(int n)
{
    int num,sum,total=1;
    int nn=n;
    int limit=sqrt(maxn*1.0);
    for(int i=0;prime[i]*prime[i]<=n;++i)
    {
        num=sum=1;
        if(n==1)
            break;
        while(n%prime[i]==0)
        {
            num*=prime[i];
            n/=prime[i];
            sum+=num;
        }
        total*=sum;
    }
    if(n!=1)
        total*=(n+1);
    return total-nn;
}
int main()
{
    getp();
    int T;
    int num;
    scanf("%d",&T);
    while(T--)
    {

        scanf("%d",&num);
        if(num==1)
        {
            printf("0\n");
            continue;
        }
        else if(isprime[num])
        {
            printf("1\n");
            continue;
        } else
            printf("%d\n",fenjie(num));
    }
    return 0;
}

原文地址:https://www.cnblogs.com/Vampire6/p/11333622.html

时间: 2024-10-29 04:00:28

七夕节 HDU - 1215 (唯一分解 素数筛法 因子之和加强版)的相关文章

(hdu step 2.1.5)七夕节(球一个数的所有因子之和)

题目: 七夕节 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4249 Accepted Submission(s): 1499   Problem Description 七夕节那天,月老来到数字王国,他在城门上贴了一张告示,并且和数字王国的人们说:"你们想知道你们的另一半是谁吗?那就按照告示上的方法去找吧!"人们纷纷来到告示前

HDU 1215 七夕节(约数之和)

七夕节 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 39837    Accepted Submission(s): 12523 Problem Description 七夕节那天,月老来到数字王国,他在城门上贴了一张告示,并且和数字王国的人们说:"你们想知道你们的另一半是谁吗?那就按照告示上的方法去找吧!" 人们纷纷来到

HDU 1215.七夕节【筛选法】【7月26】

七夕节 七夕节那天,月老来到数字王国,他在城门上贴了一张告示,而且和数字王国的人们说:"你们想知道你们的还有一半是谁吗?那就依照告示上的方法去找吧!" 人们纷纷来到告示前,都想知道谁才是自己的还有一半.告演示样例如以下: 数字N的因子就是全部比N小又能被N整除的全部正整数,如12的因子有1,2,3,4,6. 你想知道你的还有一半吗? Input 输入数据的第一行是一个数字T(1<=T<=500000),它表明測试数据的组数.然后是T组測试数据,每组測试数据仅仅有一个数字N(

杭电 HDU 1215 七夕节

七夕节 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 33838    Accepted Submission(s): 10558 Problem Description 七夕节那天,月老来到数字王国,他在城门上贴了一张告示,并且和数字王国的人们说:"你们想知道你们的另一半是谁吗?那就按照告示上的方法去找吧!" 人们纷纷来到

hdu 1215 七夕节

七夕节 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 47104    Accepted Submission(s): 15117 Problem Description 七夕节那天,月老来到数字王国,他在城门上贴了一张告示,并且和数字王国的人们说:"你们想知道你们的另一半是谁吗?那就按照告示上的方法去找吧!"人们纷纷来到告示

HDU 1215 七夕节 数论

七夕节 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 七夕节那天,月老来到数字王国,他在城门上贴了一张告示,并且和数字王国的人们说:"你们想知道你们的另一半是谁吗?那就按照告示上的方法去找吧!" 人们纷纷来到告示前,都想知道谁才是自己的另一半.告示如下: 数字N的因子就是所有比N小又能被N整除的所有正整数,如12的因子有1,2,3,4,6. 你想知

HDU1215 七夕节(因子之和)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1215 题目描述: 七夕节 Problem Description 七夕节那天,月老来到数字王国,他在城门上贴了一张告示,并且和数字王国的人们说:"你们想知道你们的另一半是谁吗?那就按照告示上的方法去找吧!"人们纷纷来到告示前,都想知道谁才是自己的另一半.告示如下: 数字N的因子就是所有比N小又能被N整除的所有正整数,如12的因子有1,2,3,4,6.你想知道你的另一半吗? Input 输

打表(1215)七夕节

Problem Description 七夕节那天,月老来到数字王国,他在城门上贴了一张告示,并且和数字王国的人们说:"你们想知道你们的另一半是谁吗?那就按照告示上的方法去找吧!"人们纷纷来到告示前,都想知道谁才是自己的另一半.告示如下: 数字N的因子就是所有比N小又能被N整除的所有正整数,如12的因子有1,2,3,4,6.你想知道你的另一半吗? Input 输入数据的第一行是一个数字T(1<=T<=500000),它表明测试数据的组数.然后是T组测试数据,每组测试数据只有

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

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