您的位置:首页 > 其它

NYOJ 476 谁是英雄(唯一素因子分解定理)

2015-01-08 18:47 381 查看
题目描述 

http://acm.nyist.net/JudgeOnline/problem.php?pid=476

十个数学家(编号0-9)乘气球飞行在太平洋上空。当横越赤道时,他们决定庆祝一下这一壮举。于是他们开了一瓶香槟。不幸

的是,软木塞在气球上打了一个洞,氢气泄漏,气球开始下降,眼看就要落入海中,所有人将要被鲨鱼吃掉。

但是尚有一线生机--若其中一人牺牲自己跳下去的话,那他的朋友们还能多活一会儿。但仍然有一个问题存在--谁

跳下去?所以他们想了一个非常公平的办法来解决这个问题--首先,每人写一个整数ai;然后计

算出a1×a2×a3×a4×……×a10的积的约数的个数N。例如,6的约数有4个(1、2、3、6),则N为4。这位牺牲自

己的英雄将由N的个位数来决定(编号为N的个位数的人要跳下去)。你的任务是求出N。
输入T(T<=10)组测试数据。

十个整数ai(1≤ai≤10000)。输出N的个位数样例输入
1
1 2 6 1 3 1 1 1 1 1

样例输出
9


题目分析:

唯一素因子分解问题,对于任意一个数n,都可以表示为:n=p[0]^a[0]*......*p[i]^a[i]*......*p
^a
,其中p[i]是素数,a[i]是整数>0,而n的约数的个数sum为,sum=(a[0]+1)*.....*(a[i]+1)*......(a
+1)。

AC代码:

/**
*@xiaoran
*唯一素因子分解,n的约数个数为PI(a[i]+1)
*res=(a[0]+1)*(a[1]+1)*...*(a
+1),其中a[i]均为素数
*/
#include<iostream>
#include<cstdio>
#include<map>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
#include<stack>
#include<cstdlib>
#include<cctype>
#include<cmath>
#define LL long long
using namespace std;
int a[10000];
int main()
{
int t,n;
cin>>t;
while(t--){
int res=1,x,k,m=0;
memset(a,0,sizeof(a));
for(int i=0;i<10;i++){
cin>>n;
if(m<n) m=n;//记录最大值
x=n;
for(int i=2;i<=n;i++){
while(x%i==0){//记录每个素因子出现的次数
a[i]++;
x/=i;
}
if(x==1) break;
}
}
for(int i=2;i<=m;i++){
res*=(a[i]+1);
}
cout<<res%10<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: