题意:给定三个数a、b、c,构造一个序列,这个序列的元素的质因数只能是a或b或c,求这个序列的第n个数。
另外两道题的思路几乎相同:1338:因子只能是2、3或5;
2591:如果x在序列里,那么2x+1和3x+1一定在。
思路:通过下标进行枚举。
2545代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define clr(s,t) memset(s,t,sizeof(s))
int a,b,c,n;
long long s[10000];
int main(){
int i,ia,ib,ic;
long long k;
scanf("%d %d %d %d",&a,&b,&c,&n);
s[1] = ia = ib = ic = 1;
for(i = 1;i<=n;i++){
k = min(min(s[ia]*a, s[ib]*b), s[ic]*c);
s[i+1] = k;
if(k == s[ia]*a)
ia++;
if(k == s[ib]*b)
ib++;
if(k == s[ic]*c)
ic++;
}
printf("%lld\n",k);
return 0;
}
1338代码:
#include <stdio.h>
int s[1502];
int main()
{
int min(int x,int y,int z);
int i2,i3,i5;
int i;
int n;
i2 = i3 = i5 = 1;
s[1] = 1;
for(i = 2;i<=1500;i++){
s[i] = min(s[i2]*2,s[i3]*3,s[i5]*5);
if(s[i] == s[i2]*2) i2++;
if(s[i] == s[i3]*3) i3++;
if(s[i] == s[i5]*5) i5++;
}
while(scanf("%d",&n)&&n){
printf("%d\n",s[n]);
}
}
int min(int x,int y,int z){
x = x < y ? x : y;
x = x < z ? x : z;
return x;
}
2591代码:
#include <stdio.h>
int s[10000002];
int main()
{
int a,b;
int n;
int i = 1;
a = b = 1;
s[1] = 1;
while(++i<=10000000){
if(2*s[a]+1 < 3*s[b]+1){
s[i] = 2*s[a]+1;
a++;
}
else if(2*s[a]+1 > 3*s[b]+1){
s[i] = 3*s[b]+1;
b++;
}
else{
s[i] = 2*s[a]+1;
a++;
b++;
}
}
while(scanf("%d",&n)!=EOF){
printf("%d\n",s[n]);
}
}