七夕节 HDU - 1215 (唯一分解 素数筛法 因子之和加强版)
Posted RUBY-WOO
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了七夕节 HDU - 1215 (唯一分解 素数筛法 因子之和加强版)相关的知识,希望对你有一定的参考价值。
七夕节 HDU - 1215
题目链接:https://vjudge.net/problem/HDU-1215#author=0
题目:
七夕节那天,月老来到数字王国,他在城门上贴了一张告示,并且和数字王国的人们说:"你们想知道你们的另一半是谁吗?那就按照告示上的方法去找吧!"
人们纷纷来到告示前,都想知道谁才是自己的另一半.告示如下:
数字N的因子就是所有比N小又能被N整除的所有正整数,如12的因子有1,2,3,4,6.
你想知道你的另一半吗?
人们纷纷来到告示前,都想知道谁才是自己的另一半.告示如下:
数字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 20Sample 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; }
以上是关于七夕节 HDU - 1215 (唯一分解 素数筛法 因子之和加强版)的主要内容,如果未能解决你的问题,请参考以下文章