整數劃分(sum.pas/c/cpp)
【題目描述】
從檔案中讀入乙個正整數n(10≤n≤31 000)。要求將n寫成若干個正整數之和,並且使這些正整數的乘積最大。 例如,n=13,則當n表示為4+3+3+3(或2+2+3+3+3)時,乘積=108為最大。
【輸入格式】(sum.in):
乙個整數,n
【輸出格式】(sum.out):
【輸入樣例】
13【輸出樣例】
3108
呃,話說這是乙個很經典的規律: 3
越多越好,如果剩下了
1 ,就與最後乙個
3 拼成
4 ,如果剩下了
2 ,就直接
*2 。。。。。。。
然後,就是高精了。
**(suemiller
)program acrush;
type arr=array[0..6000]of longint;
var n,nn:longint;
i,j,k,l,r,mid,ll,rr:longint;
ans:arr;
procedure mul(b:longint);
var i:integer;
begin
for i:=1 to ans[0] do
ans[i]:=ans[i]*b;
for i:=1 to ans[0] do
begin
ans[i+1]:=ans[i] div 10+ans[i+1];
ans[i]:=ans[i] mod 10;
end;
while ans[ans[0]+1]>0 do
begin
inc(ans[0]);
ans[ans[0]+1]:=ans[ans[0]] div 10;
ans[ans[0]]:=ans[ans[0]] mod 10;
end;
end;
begin
assign(input,'sum.in');reset(input);
assign(output,'sum.out');rewrite(output);
readln(n);
ll:=0;rr:=0;
l:=2;r:=n>>1;
i:=n div 3;
fillchar(ans,sizeof(ans),0);
ans[1]:=1;
ans[0]:=1;
if n mod 3=0 then
begin
k:=3;
for j:=1 to i do
mul(k);
endelse begin
nn:=n-n div 3*3;
for j:=1 to i-1 do
begin
mul(3);
end;
if nn=2 then
begin
mul(3);
mul(nn);
endelse begin
mul(4);
end;
// for j:=1 to i do write(d[j],' ');
// writeln;
// for j:=ans[0] downto 1 do write(ans[j]);
// writeln;
end;
writeln(ans[0]);
if ans[0]>100 then
begin
for i:=ans[0] downto ans[0]-100+1 do
write(ans[i]);
writeln;
endelse begin
for i:=ans[0] downto 1 do
write(ans[i]);
writeln;
end;
close(input);close(output);
end.
整數劃分解題報告(DP方法)
1.問題描述 給定乙個正整數n和k 1.將n劃分成若干正整數之和的劃分數。2.將n劃分成k個正整數之和的劃分數。3.將n劃分成最大數不超過k的劃分數。4.將n劃分成若干奇正整數之和的劃分數。5.將n劃分成若干不同整數之和的劃分數。2.問題分類 總的來說這些都是揹包問題 第乙個問 就是乙個完全揹包,揹...
最大整數 解題報告
測試可見洛谷p1107 最大整數 noip1998 問題描述 設有n個正整數 n 20 將它們聯接成一排,組成乙個最大的多位整數。例如 n 3時,3個整數13,312,343聯接成的最大整數為 34331213 又如 n 4時,4個整數7,13,4,246聯接成的最大整數為 7424613 輸入格式...
NOI2017 整數 解題報告
有一些比較簡單的 log 2n 做法 比如暴力在動態開點線段樹上維護每個位置為 0 還是 1 我們發現涉及到某一位加上 1 或者減去 1 實際上對其他位的影響只有區間覆蓋,通過線段樹上二分可以得到區間覆蓋的位置,然後暴力區間覆蓋即可。反正我這種菜雞大常數寫法只得到了68分.考慮利用勢能,注意到如果同...