松鼠的窝 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 />
动态规划有时被称为递归的相反的技术。动态规划方案通常使用一个数组来建立一张表,用于存放被分解成众多子问题的解。当算法执行完毕,最终的解法将会在这个表中找到。今天我们先从我们最熟的斐波那契数列数列开始。