题目描述
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。
1
1 2 6 1 3 1 1 1 1 1
9
题目分析:
唯一素因子分解问题,对于任意一个数n,都可以表示为:n=p[0]^a[0]*......*p[i]^a[i]*......*p[n]^a[n],其中p[i]是素数,a[i]是整数>0,而n的约数的个数sum为,sum=(a[0]+1)*.....*(a[i]+1)*......(a[n]+1)。
AC代码:
/** *@xiaoran *唯一素因子分解,n的约数个数为PI(a[i]+1) *res=(a[0]+1)*(a[1]+1)*...*(a[n]+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; }
原文地址:http://blog.csdn.net/fool_ran/article/details/42528215