20161004 NOIP 模擬賽 T1 解題報告

2022-06-02 16:21:08 字數 3415 閱讀 5605

第1題  小麥畝產一千八

【問題描述】

「有了金坷垃,肥料一袋能頂兩袋撒,小麥畝產一千八,吸收兩公尺下的氮磷鉀……」,話說hysbz(hengyang school for boys & zy)學識淵博孩紙們一講到糧食,都會想起印度那個著名的故事:國王要在第乙個格仔裡放入一粒小麥,接下來的格仔放入前面乙個格仔的兩倍的小麥。這樣所需小麥總數是巨大的,哪是不用金坷垃就能完成的任務?不過為了減輕國王的任務,那個下棋獲勝的宰相換了乙個要求:「我只需要你在棋盤外放一粒小麥,可以將其理解為第0個格仔,然後你需要在第乙個格仔裡放入若干小麥,之後每乙個格仔放入前兩個格仔的小麥數之和的小麥,並且要滿足第a個格仔放x粒小麥,第b個格仔放……」說到這,宰相突然發現自己說的滿足第a個格仔放x粒小麥的情況可能不存在……欺君可是大罪啊!國王看到宰相遲遲不說,自己也煩了!我自己來算!於是國王拜託你,讓你算出第b個格仔應該放幾粒小麥。當然,就算答案不存在,你也是要告訴國王的。

【輸入格式】kela.in

該題有多組資料,請讀到檔案末結束。

對於每一組資料僅一行,3個正整數a,x,b,分別表示第a個格仔放了x粒小麥,以及你所需要計算的是第b個格仔的小麥數量。

【輸出格式】kela.out

對於每一次詢問,僅1個整數,為第b個格仔的小麥數量,若宰相說的情況不存在,那麼請輸出-1。

樣例輸入

樣例輸出

1 1 2
3 5 4
3 4 6
12 17801 19
2

8

-1

516847

【樣例解釋】

對於樣例二,f[1]=2時,能夠滿足f[3]=5,因此宰相沒有撒謊,此時第5個格仔的小麥數應為f[4]=f[2]+f[3]=3+5=8.

資料範圍與約定

對於50%的資料:如果答案存在,那麼p<=50

對於100%的資料:1<=資料組數<=10000,1<=a,b<=20, 資料保證如果答案存在,那麼1<=p<=1000000.(注:p是第一格放置的小麥數)。

———————————————分割線———————————————

分析:

這道題,本蒟蒻只拿到50分(不開森),我果然還是太弱了。

說說我的暴力思路,二分第乙個格仔的小麥數(1~1000000),然後取中值,根據這個值遞推,這個思路太暴力了(捂臉)。

下面50分的 暴逆 暴力**:

1 #include "

cstdio"2

3using

namespace

std ;

4const

int maxn = 10010

;5 typedef long

long

qaq ; 67

qaq t[ maxn ] ;89

bool check ( int n , int

target )

1617

intmain ( )

33else

if ( t[ a ] > x ) right =mid ;

34else

if ( t[ a ] < x ) left = mid + 1;35

}36if ( flag==true)40

else printf ( "

-1\n

") ;

4142}43

fclose(stdin);

44fclose(stdout);

45return0;

46 }

暴力ac思路:

這道題的遞推式與fibonacci數列遞推式相同,只是首項不同。那麼,這個數列與fibonacci數列有什麼聯絡?

設 fibonacci 數列的每一項為f ( i ) , 即f( 1 ) = 1 , f( 2 ) = 1 ,f( 3 ) = 2 , ... ... , f ( n ) = f ( n - 1 ) + f ( n - 2 ) 

現在要求推出的數列為 f ( i ) , f( 1 ) = 1 , f( 2 ) = p ,f( 3 ) = p + 1 , f ( 4 ) = 2 * p + 1  , ... ... , f ( n ) = f ( n - 1 ) + f ( n - 2 ) 

設g ( i ) = f ( i ) - f ( i ) ,即

g( 1 ) = 0 , g ( 2 ) = p - 1 , g( 3 ) = p - 1 , g( 4 ) = 2 * ( p - 1 )  , g ( 5 ) = 3 * ( p - 1 ) , ... , g ( n ) = f ( n - 1 ) * ( p - 1 ) 

對於本題  , 已知 f ( a ) = x  , 即

g ( a ) = f ( a ) - f ( a )  =>  f ( a - 1 ) * ( p - 1 ) = x - f ( a )  

這道題中 , x已知 , fibonacci數列又可以通過預處理計算,可以求出 p .

如果 p 不是整數 , 則輸入不合法,直接輸出「-1」。

之後便可以通過遞推求得 f ( b ) .

1 #include "

cstdio

"2 #include "

algorithm"3

4using

namespace

std ;

5const

int inf = 2147483647

;6 typedef long

long

qaq ;

78 qaq a,x,b,f=;

9 qaq f[ 30

] ;10

intmain ( )

18else

24 printf ( "

%d\n

" , f[ b+1

] ) ;25}

26}27return0;

28 }

ac本蒟蒻要學一點了,noip_rp++。

2016-10-05 00:23:49

(完)

noip模擬賽 密碼

表示沒看懂演算法3 問題描述 有壓迫,就有反抗。mored的寵物在法庭的幫助下終於反抗了。作為乙隻聰明的寵物,他打算把魔法使mored的魔法書盜去,奪取mored的魔法能力。但mored怎麼會讓自己的魔法書輕易地被盜取?mored在魔法書上設定了乙個密碼鎖,密碼鎖上有乙個問題。施以斯臥鋪魔法吧,你有...

NOIP模擬賽 老師

題目描述 一座有n層的教學樓裡有一些學生,第i 0 i n 層有studentsi個學生。你被給定了乙個數k,如果第i層有x個學生,那麼這一層需要 x k 個老師。你可以調整每個學生的樓層,但是每個學生至多只能調整一層,就是說第i層的學生只能去第i 1層 如果有的話 第i層 第i 1層 如果i 1 ...

NOIP模擬賽 分錢

題目描述 兩個人在街上撿到了一些錢,這些錢共有n張,他們等了很久也沒有等來失主,於是決定把錢平分。但錢可能無法平分。他們先把能夠平分的錢盡量先平分了,使得剩下不能平分的錢盡量少。這些不能平分的錢怎麼辦呢他?他們決定拿去賭場裡面賭一把。他們運氣太好了,那些不能平分的錢變成了雙倍,於是他們就把那個錢分了...