谁是英雄

时间限制:1000 ms  |  内存限制:65535 KB
难度:3
描述

十个数学家(编号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

其实以前做过类似求乘积的约数个数,很明显乘积会超范围,肯定是要从因子入手的,于是百度百科了一下“约数个数定理”,就知道有快速方法,只不过要先求出质因子个数,假如其乘积的质因子a1,a2,a3,a4...ak的个数分别是p1,p2,p3...pk,那么约数个数sum=(p1+1)(p2+1)(p3+1)....(pk+1);这便是约数个数定理;数据范围是10000,只有10个数,所以可以暴力分解质因数然后求出每个质因数的个数即可;

下面提供两种代码:

1.0    先打个10000的素数表,因为这10个数每个数都要分解质因子,只需将每个数分别分解(怎么分解请看代码):

using namespace std;
const int N=10000+10;
int k,b[N],s[N],a[N]
void init()
{
k=0;
memset(b,-1,sizeof(b));
memset(s,0,sizeof(s));//将10000内的素数储存起来,分解的时候直接除以素数;
b[0]=b[1]=0;
for(int i=2; i<=N; i++)
if(b[i])
{
s[k++]=i;
if(i>N/i) continue;
for(int j=i*i; j<=N; j+=i)
b[j]=0;
}
}
int main()
{
int t,x,i,j;
init();
scanf("%d",&t);
while(t--)
{
memset(a,0,sizeof(a));//存每个质因子出现的次数;
int f=1;
for(i=1; i<=10; i++)
{
scanf("%d",&x);
if(x==1)
continue;
else//分解质因数;
{
f=0;
for(j=0; j<k; j++)
{
while(x%s[j]==0)//注意一直除下去;
{
x/=s[j];
a[s[j]]++;//质因子出现的次数;
}
if(x==1) break;
if(b[x])//如果x本身就是素数了再加起来;比如:6/2=3;
{
a[x]++;
break;
}
}
}
}
if(f)//如果10个数全部是1则输出1;
{
printf("1\n");
continue;
}
else
{
int sum=1;
for(i=0; i<k; i++)//这里查找就方便一点;
if(a[s[i]])
sum*=(a1[s[i]]+1);
printf("%d\n",sum%10);//千万注意取个位数,题意描述不清,不然此代码一遍过;
}
}
return 0;
}

2.0  原理和上面一样,只不过内存少了一点吗,就是基于数据个数和范围都较小,所以分解质因子的时候暴力分解:

using namespace std;
const int N=10000+10;
int b[N],a[N];
int main()
{
int t,x,i,j;
scanf("%d",&t);
while(t--)
{
memset(a,0,sizeof(a));
for(i=1; i<=10; i++)
{
scanf("%d",&x);
for(j=2; x!=1&&j<=10000; j++)//分解质因数;
if(x%j==0)
{
x/=j;
a[j]++;
j--;//这里和上面那个while()含义一样,
}
}
int sum=1;
for(i=0; i<10000; i++)//这里查询就比较慢了,很多都不是素数况且没有出现过;
if(a[i])
sum*=(a[i]+1);
printf("%d\n",sum%10);
}
return 0;
}

NYOJ-476谁是英雄,分解质因子求约数个数!的更多相关文章

  1. N!分解质因子p的个数_快速求组合数C(n,m)

    int f(int n,int p) { ) ; return f(n/p,p) + n/p; } https://www.xuebuyuan.com/2867209.html 求组合数C(n,m)( ...

  2. HDU 4497 GCD and LCM(分解质因子+排列组合)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4497 题意:已知GCD(x, y, z) = G,LCM(x, y, z) = L.告诉你G.L,求满 ...

  3. UVA 10780 Again Prime? No Time. 分解质因子

    The problem statement is very easy. Given a number n you have to determine the largest power of m,no ...

  4. hdu6237 分解质因子

    题意:给一堆石子,每次移动一颗到另一堆,要求最小次数使得,所有石子数gcd>1 题解:枚举所有质因子,然后找次数最小的那一个,统计次数时,我们可以事先记录下每堆石子余质因子 的和,对所有石子取余 ...

  5. HDU 4135 Co-prime (容斥+分解质因子)

    <题目链接> 题目大意: 给定区间[A,B](1 <= A <= B <= 10 15)和N(1 <=N <= 10 9),求出该区间中与N互质的数的个数. ...

  6. Minimum Sum LCM UVA - 10791(分解质因子)

    对于一个数n 设它有两个不是互质的因子a和b   即lcm(a,b) = n 且gcd为a和b的最大公约数 则n = a/gcd * b: 因为a/gcd 与 b 的最大公约数也是n 且 a/gcd ...

  7. Codeforces Round #828 (Div. 3) E2. Divisible Numbers (分解质因子,dfs判断x,y)

    题目链接 题目大意 给定a,b,c,d四个数,其中a<c,b<c,现在让你寻找一对数(x,y),满足一下条件: 1. a<x<c,b<y<d 2. (x*y)%(a ...

  8. BNU 13259.Story of Tomisu Ghost 分解质因子

    Story of Tomisu Ghost It is now 2150 AD and problem-setters are having a horrified time as the ghost ...

  9. HDU1452:Happy 2004(求因子和+分解质因子+逆元)上一题的简单版

    题目链接:传送门 题目要求:求S(2004^x)%29. 题目解析:因子和函数为乘性函数,所以首先质因子分解s(2004^x)=s(2^2*x)*s(3^x)*s(167^x); 因为2与29,166 ...

随机推荐

  1. webapp开发学习---Cordova环境搭建

    Cordova 使用HTML, CSS & JS进行移动App开发;多平台共用一套代码;免费开源 步骤:(来自Cordova官网) 1.安装Cordova(在node.js环境下进行安装) 命 ...

  2. Sql Server把本地数据库传到服务器数据库

    上一篇文章我们已经把网站布署到服务器中了,如果是动态网站肯定是有数据库的,接下来通过Sql Server把本地数据库上传到服务器数据库中. 打开Sql Server连接本地数据库,选中要导出的数据库, ...

  3. Spring注解驱动开发之扩展原理

    前言:现今SpringBoot.SpringCloud技术非常火热,作为Spring之上的框架,他们大量使用到了Spring的一些底层注解.原理,比如@Conditional.@Import.@Ena ...

  4. AJPFX解析关于编码ansi、GB2312、unicode与utf-8的区别

    大家平时遇到乱码问题是否有自己的一套解决方案?这篇文章就是介绍一下常用的编码方式关于编码ansi.GB2312.unicode与utf-8的区别 先做一个小小的试验: 在一个文件夹里,把一个txt文本 ...

  5. Node.js——render封装

    封装 挂在到res上

  6. PostgreSQL学习手册(五) 函数和操作符

    PostgreSQL学习手册(五) 函数和操作符 一.逻辑操作符:    常用的逻辑操作符有:AND.OR和NOT.其语义与其它编程语言中的逻辑操作符完全相同. 二.比较操作符:    下面是Post ...

  7. C++ 引用、指针

    一.引用 1.引用的作用:给变量起一个别名,是c++对c的扩充.原名和别名有相同的地址,根本上就是同一个东西,只是名字不一样.c++的引用机制主要是为了用作函数参数,增强函数传递数据的能力,比如swa ...

  8. 【Gambit】Gambit使用教程

    第一章 Gambit使用 Gambit介绍 网格的划分使用Gambit软件,首先要启动Gambit,在Dos下输入Gambit <filemane>,文件名如果已经存在,要加上参数-old ...

  9. Swift - 值类型与引用类型的初步探究

    前言 swift中的结构体和类在组成和功能上具有一定的相似性.两者都可以含有成员属性.成员方法用于数据存储和功能性模块封装.往往造成不知如何对二者进行区分和使用 值类型概念和引用类型概念 值类型的概念 ...

  10. blockdev - 从命令行调用区块设备控制程序

    总览(SYNOPSIS) blockdev [options] commands devices 描述(DESCRIPTION) blockdev 工具允许从命令行调用区块设备控制程序. 选项(OPT ...