松鼠的窝 2018-02-02
题目要求:给定n个正整数,请找出其中有多少个数x满足:在这n个数中存在数y,使y=kx,其中k为大于1的整数
输入描述 :第一行输入一个n,接下来一行输入n个正整数ai
输出描述:输出符合条件个数
示例:
输入 5 1 2 3 4 5 输出 2 说明 5个数中1和2符合条件,1是后面每个数的因子,2是4的因子 备注: 1≤n,ai≤1000000
<strong>解决1:<br /></strong>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
using namespace std;
const int N = 1000005;
int cc[N];
bool can[N];
int getint()
{
char ch=getchar();
int res=0;
while((ch<'0' || ch>'9') && ch!='-')
ch=getchar();
bool neg=0;
if(ch=='-')
{
neg=1;
ch=getchar();
}
while('0'<=ch && ch<='9')
{
res=res*10+ch-'0';
ch=getchar();
}
if(neg)
res=-res;
return res;
}
int main()
{
int n,i,j;
n=getint();
for(i=1;i<=n;i++)
{
int now=getint();
cc[now]++;
}
int ans=0;
for(i=1;i<N;i++)
{
for(j=i+i;j<N;j+=i)
{
if(cc[j])
can[i]=1;
}
}
for(i=1;i<N;i++)
{
if(can[i])
ans+=cc[i];
}
cout<<ans<<endl;
return 0;
}<strong>解决2:</strong>
#include<stdio.h>
#include<algorithm>
using namespace std;
int a[1000001],b[2000001];
int main()
{
int n,i;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&a[i]);
b[a[i]]++;
}
int sum=0;
sort(a,a+n);
for(i=1;i<a[n-1];i++){
if(b[i]){
for(int j=2;i*j<=a[n-1];j++)
if(b[i*j])
{sum+=b[i];break;}
}
}
printf("%d\n",sum);
}<br /><br />
动态规划有时被称为递归的相反的技术。动态规划方案通常使用一个数组来建立一张表,用于存放被分解成众多子问题的解。当算法执行完毕,最终的解法将会在这个表中找到。今天我们先从我们最熟的斐波那契数列数列开始。