七夕节 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