2023年東莞市GDOI市選題第一題

2021-06-28 13:26:10 字數 1794 閱讀 6996

第一題:數列

提交檔案:sequence.pas/c/cpp

輸入檔案:sequence.in

輸出檔案:sequence.out

問題描述:

把乙個正整數分成一列連續的正整數之和。這個數列必須包含至少兩個正整數。你需要求出這個數列的最小長度。如果這個數列不存在則輸出-1。

輸入格式:

每行包含乙個正整數n。

每個檔案包含多行,讀入直到檔案結束。

輸出格式:

對於每個n,輸出一行,為這個數列的最小長度。

輸入樣例:

輸出樣例:-1

資料範圍:

對於所有資料,n≤263。

解題報告:

列舉資料進行分析可以發現連續等差數列具有單調遞增對稱性,數列可以表示為ai...a2a1xb1b2...bi,其中x為數列的對稱點,x可以是乙個數,它的值為x=(a1+b1)/2,如果x不是乙個數,那麼b1-a1=1,同時有a1+b1=a2+b2=...=ai+bi,進一步分析可以發現資料本身可根據奇偶性進行分解:當n為奇數時,解為2;當n為偶數時則進行因子分解,求出最小的奇數因子,該最小奇數因子即為問題解,但是也有特殊情況,例如0,1,2,3,4數列它的長度為5,而實際長度是4,所以對奇數序列如果出現數列延伸到0和負數範圍時就需要進行調整。

在上面的分析基礎上,利用數列的對稱性,特殊處理n為奇數和n=1的情況,對n為偶數直接列舉數列長度,對數列長度本身也具有奇偶性,遇到奇數序列長度則判斷:n是否能 整除數列長度 如果是則為解;遇到偶數序列長度則判斷:n整除數列長度的餘數是否為序列長度的一半,如果是則為解。

好複雜。考試時絕對想不到。

本想騙幾分的,竟每組資料都有乙個值「1139300094624923648」,剛好過不了,一分沒有。。

var i,j,n,m,ans:int64;

begin

assign(input,'sequence.in');

reset(input);

assign(output,'sequence.out');

rewrite(output);

while not eof do

begin

readln(n);

ans:=-1;

if n=1 then ans:=-1

else

if n mod 2<>0 then ans:=2

else

begin

i:=n;

while i mod 2=0 do i:=i div 2;

if (i+1)/2-n/i>0then

begin

m:=n div i*2;

ans:=m;

end;

m:=3;

while (m*m<=i) and ((ans=-1) or (m

begin

if i mod m=0 then

if n/m-(m-1)/2>0then

begin

ans:=m;

break;

end;

m:=m+2;

end;

m:=i;

if (m<>1) and (n/m-(m-1)/2>0) and ((ans=-1) or (m

ans:=m;

end;

writeln(ans);

end;

close(input);close(output);

end.

2014東莞市選 分組

file io input group.in output group.out time limits 1000 ms memory limits 262144 kb detailed limits special judge description 有n個字串,給這些字串分組,使得每個字串屬於且僅...

東莞市選2008 飛彈

這題的n很小。我們可以先用floyd求出兩兩之間的最小距離。然後要求最值,我們可以二分最長的距離。然後用匈牙利來判斷。將小於等於mid的邊新增 上標 include include include using namespace std struct nodee 10010 int k,n,m,f ...

東莞市選 格鬥俱樂部(區間dp)

輸出 輸出包含n行,每行為乙個整數 0 或 1 1 表示第i號選手有可能成為冠軍,0 表示不可能。輸入輸出樣例1 data.in 3 0 1 1 0 0 1 0 0 0 data.out 1 0 0區間dp嘛,狀態轉移也好想,設 f i j k 表示第 i 個人到第 j 個人打完時第 k 個人能不能...