(File IO): input:div.in output:div.out
时间限制: 1000 ms 空间限制: 131072 KB 具体限制
Goto ProblemSet
题目描述
羊年到了,村长开始教小羊学习
P
a
s
c
a
l
Pascal
Pascal语言,刚开始学习四则运算。村长在白板上写下两个整数
16
16
16和
3
3
3,问小羊们,有
16
16
16只羊,平均分到
3
3
3个羊村,每个羊村分到的数量必须相同,这个分配的数量最大是多少?小羊们很快就得到了答案,每个羊村分到
5
5
5只,有
1
1
1只羊就只能落单了。村长在白板上写下
5
5
5。没错,这个就是
D
i
v
Div
Div(整除)的用法!
为了检验小羊们是否掌握了整除运算,村长要求小羊们轮流从白板上任意选取两个不同的数,由大数整除小数,若所得结果没有出现在白板上,就将该值写在白板上。直到小羊们再也找不到没出现过的整数。
虽然这样上课很锻炼小羊们的运算能力,但是课堂时间有限。为了控制课堂时间,村长想要知道,根据当前白板上的数字,最终白板上会出现几个数字?现在请你帮他编写一个程序快速计算一下吧!
输入
第一行一个整数
N
N
N,表示当前白板上出现的整数个数。
第二行
N
N
N个整数,中间用空格分隔,表示当前在白板上的数字,保证每个数字都不相同。
输出
输出一个整数,表示最终白板上数字的个数。
样例输入
【样例输入1】
2
16 3
【样例输入2】
3
17 2 1
样例输出
【样例输出1】
4
【样例输出2】
5
数据范围限制
50
50
50%的数据,
N
<
=
50
N<=50
N<=50;
100
100
100%的数据,
N
<
=
100
,
1
<
=
a
i
<
=
100
N<=100,1<=ai<=100
N<=100,1<=ai<=100。
提示
【样例
1
1
1解释】
选择
16
16
16和
3
3
3,写下
5
5
5;选择
5
5
5和
3
3
3,写下
1
1
1;共
16
,
3
,
5
,
1
16,3,5,1
16,3,5,1,四个整数。
【样例2解释】
选择
17
17
17和
2
2
2,写下
8
8
8;再选择
8
8
8和
2
2
2,写下
4
4
4;共
17
,
2
,
8
,
4
,
1
17,2,8,4,1
17,2,8,4,1,五个整数。
解题思路
数据较小,可以开一个桶存出现过的数字,所以可以n^2暴力枚举x,y得出的值,得出的结果再次存入桶中。因为x/y一定比x小,所以可以一次得出结果,最后统计所有数字。
代码
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cmath>
using namespace std;
int n,a[105],f[105],ans;
int main(){
freopen("div.in","r",stdin);
freopen("div.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
f[a[i]]=1;
}
for(int i=100;i>=1;i--)
{
if(f[i])
{
for(int j=i-1;j>=1;j--)
if(f[j])
f[i/j]=1;
}
}
ans=0;
for(int i=1;i<=100;i++)
if(f[i]==1)
ans++;
printf("%d",ans);
}