zoukankan      html  css  js  c++  java
  • 七夕节 HDU

    七夕节 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
    ");
                continue;
            }
            else if(isprime[num])
            {
                printf("1
    ");
                continue;
            } else
                printf("%d
    ",fenjie(num));
        }
        return 0;
    }
  • 相关阅读:
    yum下载安装mysql服务
    windows编写sh脚本在linux上不能执行
    ectouch第二讲之 文件结构
    ecshop第一讲之安装
    class id 区别
    thinkphp模板中截取中文字符串的方法分享
    CI 配置验证规则
    CodeIgniter配置之config
    codeigniter中base_url和site_url
    使用phpmyadmin导入SQL数据报错:#1062
  • 原文地址:https://www.cnblogs.com/Vampire6/p/11333622.html
Copyright © 2011-2022 走看看