有乙個數x, 0<=x<=1000, 把它拆分成幾個數的和,x1+x2+......xn=x,使得x1,x2,x3.....xn的最小公倍數最大,
要求輸入這個數 x,輸出最小公倍數 s。
可以通過使用動態規劃來計算
首先容易證明,存在一種達到最大值的拆分方案,使得每個xi最多只有乙個素因子(也就是說xi必然是1,素數或素數的冪),而且不同的xi之間互素(它們的素因子不同)。
然後就可以使用動態規劃來計算。
中第k步是計算出x1,x2,...,xn使得
x1+x2+...+xn = x
x1,x2,...,xn的所有素因子都是前k個素數, (p1=2,p2=3,p3=5,...,pk)
x1,x2,...,xn的最小公倍數最大時的情況.
所以我每步新增乙個新數(使用x+y的情況),必然有這兩個數互素( (x,y)=1 )
為了簡單起見,程式中用了gmp
#include
#include
#define max 10000
mpz_t mul[2][max+1];
mpz_t *muls1;
mpz_t *muls2;
int prime_list[max+1];
int prime_count;
mpz_t t;
void init_prime()}}
for(i=0;i<=max;i++)}}
int main()
mpz_set_ui(mul[0][0],1);
muls1 = mul[0];
muls2 = mul[1];
init_prime();
mpz_init(t);
for(i=0;i0)
}p*=prime_list[i];}}
mpz_set_ui(muls1[1],1);
for(i=1;i<=max;i++)
}for(i=2;i<=max;i++)
}for(i=1;i<=max;i++)
if(c==1)else if(c>1)
}printf("}/n");
}return 0;
}
最大最小公倍數
時間限制 1 sec 記憶體限制 128 mb 提交 125 解決 4 提交 狀態 討論版 題目描述 已知乙個正整數n,問從1 n中任選出三個數,他們的最小公倍數最大可以為多少。輸入 每個測試點 輸入檔案 存在多組測試資料。每個測試點的第一行為乙個整數task,表示測試資料的組數。在一組測試資料中 ...
最大最小公倍數
問題描述 已知乙個正整數n,問從1 n中任選出三個數,他們的最小公倍數最大可以為多少。輸入格式 輸入乙個正整數n。輸出格式 輸出乙個整數,表示你找到的最小公倍數。樣例輸入 9樣例輸出 504資料規模與約定 1 n 106。include include include using namespace...
最大最小公倍數
題目 已知乙個正整數n,問從1 n中任選出三個數,他們的最小公倍數最大可以為多少。輸入格式 輸入乙個正整數n 輸出格式 輸出乙個整數,表示你求得的最小公倍數 樣例輸入 樣例輸出 504注釋 504 9 8 7 資料規模與約定 1 n 106 分析 題目要求涉及貪心演算法,對於個人而言,更像是乙個純數...