一道程式設計 數學挑戰題,應如何思考?

時間 2021-05-31 11:10:49

1樓:灰燼之靈

python 3a=

[i+1

fori

inrange(0

,2018

)]alpha

,beta=[

2,3]

fori

inrange(3

,2018

):ifi%

3==0:

a[i]

=a[i

//3]*

3else

:alpha=a

[i//3

]beta=a

[i//3

+1]a

[i]=

alpha*3

+(beta

-alpha)*

(i%3

)print(a

[2017

])》3864

a = [i+1 for i in range(0,2018)]alpha,beta=[2,3]

for i in range(3,2018if i%3 == 0a[i] = a[i//3]*3

elsealpha = a[i//3beta = a[i//3+1a[i] = alpha*3+(beta-alpha)*(i%3)

for i in range(1,2018):

print(a[i])

》2》3

》6》3864

rua~~~

2樓:王斌

ruadef r_set(x):

r={}

for idx, value in x.items():

r[value]=idx

return r

def sub_v(i,sets):

g=None

for i_0 in range(3,i

d=3*i_0-sets[i-1]

if d>0:

if g==None:

g=dr=i_0

else:

if dg=d

r=i_0

return r

def Nsets(x):

sets={}

sets[1]=2

if x == 1:

return sets[x]

else:

for i in range(2,x+1):

setr=r_set(sets)

if i in setr:

sets[i]=3*setr[i]

else:

if sub_v(i,sets)*3+i-1==sets[sub_v(i,sets)]+sets[i-1]:

sets[i]=sets[i-1]+1

else:

return i

print("rua!")

break

return sets[x]

Nsets(2017)

Output=3864

3樓:柳一一

挺有意思的一道題,真的是老了,想了半天才想明白,總結如下:

設 f(1)=y,則f(y)=3。

因為值域為正整數,可得y>=1,當 y=1時,f(1) =1, f(1)=3 矛盾,所以 y > 1.

又有f(n)1, 所以 f(y) > f(1), 即3>y.

由 1令 f(x) = m, 則f(m) = 3x,則f(3x) = 3m = 3f(x)

很顯然這是個遞迴,即f(9x) = 3f(3x) = 3*(3f(x)) = 9f(x)

所以有 , 當x = 1時,即存在

再次運用 f(x) = m 時 f(m) = 3x公式,得到 .(n為非負整數)

即定義域在 範圍內,值域為 ,且函式單調遞增,定義域和值域均為正整數,所以可以確定 ( )

但這個時候定義域不夠全,缺少 部分,怎麼辦呢,再用一次當f(x) = m 時 f(m) = 3x公式。得到 ( )

彙總就是:

當定義域為 時,即 ( ,n為非負整數)

當定義域為 ,即 ( ,n為非負整數)

即:n為非負整數

x = 2017, 即n = 6,定義域在第二組內,則以上!

4樓:羅俊傑

這個挺有意思。

關鍵在於正整數,下面這一段是我的簡易分析:

依此可以不斷後推。可以預見的是,2017不是3的倍數,因此f(2017)肯定是卡在某兩個數之間,其值應該會有多解(嘗試找出擬合關係的做法都是不合理的,因為依條件只能得到某些特殊點與點之間的對映,被避開的點取值只要滿足遞增就夠了)。如有疏漏,敬請指正。

5樓:一念傾安

同感此題做過……

f(0)可以等於0,那麼看f(1)。顯然f(1)不能等於1,否則f(f(1))=f(1)=1,與f(f(1))=3矛盾;若f(1)≥3,則根據嚴格遞增性,f(f(1))≥f(3)>f(1)≥3,即f(f(1))>3,與f(f(1))=3矛盾;所以只能f(1)=2。

那麼可以得出f(2)=f(f(1))=3,f(3)=f(f(2))=6,f(6)=f(f(3))=9,依此類推

f(1)=2;f(2)=3; f(3)=6;f(6)=9;f(9)=18;f(18)=27;f(27)=54;f(54)=81;f(81)=162;f(162)=243; f(243)=486; f(486)=729……

中間有一些被跳過的項,可以由題中嚴格單增的條件結合條件3得出,如f(3)=6,f(6)=9,可以得出f(4)=7,f(5)=8,進一步可以得出f(7)=12,f(8)=15,這樣可以得出全部的函式值。

下面直接跳到f(729)=1458,f(1458)=2189,由於1458-729=729,2189-1458=729,可得到f(729+k)=1458+k,其中0f(2016)=f(f(1287))=3861,

f(2017)=f(f(1288))=3864。

6樓:影月

這樣的函式是否存在都是個問題.

f(n) 單調函式明顯得到.

f(1) != 1 這個也很明顯.

問題來了,值域是正整數. f(x) == 1時, x = ?

7樓:Fireman A

我自己硬推了一遍之後算是把規律做出來了,但是表述太繁複。後來我找到了乙個取巧的辦法,非常好描述:

第一步:把n表達為三進製

第二部:如果n最高位為1,則f(n)就是最高位改2。如果n最高位為2,那麼f(n)就是 n*10 然後把最高位改1。

貼個圖:

這個想法有個附帶效果:如果題目改乙個條件:f(f(f(n)))=4n, 也有解:

首先,把n表達為4進製...

8樓:EntropyIncreaser

我比較笨,沒有找出那麼通項的解,而是找到了乙個遞推的式子,通過寫程式還是得出了答案。

先放結論:

此處 而且這個數列也被OEIS收錄過了:A003605 - OEIS然後說我的思路:

引理1:單射性質,即

根據 引理2:

根據引理1,有

進而 推論1:

假設有乙個 滿足 3" eeimg="1"/>,則根據鴿籠原理,必然有乙個 使得,

則 ,但是 和 之間沒有整數了,所以我們發現沒有這麼乙個 。

先找出 的值:

設 ,首先 ,接著有

對 的證明其實就是引理2,接下來證明 的情況。

先假設 ,經檢驗發現對於 成立。

對於一組 ,有 ,進而有 。

又因為 ,

如果 ,那麼中間兩數只能是 。

如果 ,那麼因為相鄰兩數差必須小於等於3,所以只能是 。

對於前者情況,兩兩數的差為1,後者則為3, 仍然沒有被破壞。

所以我們可以得出結論:

寫成C++程式:

#include

using

namespace

std;

const

intN

=2017

;inta[

N+1];

intmain

()printf

("%d\n"

,a[N

]);return0;

}輸出結果:3864

9樓:企鵝叔叔

詳細描述可以看Richard Xu那一條回答

注意一下每行黃色重複時候n的值。當n屬於3^a~3^a*2時,定義域的整數取值有3^a個;

f(n)取值也正好為3^a*2~3^a*3,正好能塞下3^a個連續自然數

所以稍微不嚴謹點的描述

當n取值在3的相鄰兩個整數冪之間時

前半段的f(n)值為連續自然數,從2n取到3n;

後半段中,n正好被是前半段f(n)的值覆蓋,還是連續的整數

所以f(n)的取值是2n*3~3n*3的等差數列

3^6=729,3^7=2187,中間值是1458

前半段為:n取729~1458的連續自然數,f(n)值是1458~2187

已經涵蓋了2017,對應的f(1288)=2017

最終f(2017)=f(f(1288))=3864了。

10樓:冒泡

設f(1)=x,則f(x)=3,首先可以得出:x>1,然後由於f(3)=3x,所以f(2)是x和3x之間,接下來f(3x)=3*3=9,由於遞增,則9-x>=3x-1,解得x<=2.5,所以x只能是2,所以這個序列就推出來了

11樓:杜安

以下是不嚴謹的推論:

由f(y) = 3x; f(x)=y;可得:

f(1) = y'; f(y') = 3;

假設y'=1則有f(1) = 1; f(1) = 3;不符合單調遞增,所以y'>1

假設y'>=3則有f(1) >= f(y') ;同樣與單調遞增矛盾,所以y'<3

所以y'=2;

f(1) = 2; f(2) = 3;

好的,開始程式設計

intcalc

(intn)

;for

(inti=

3;i<=n;

i++)else

}inty=

yArray[n

];returny;

}calc

(2017);

12樓:靈劍

我寫個簡單點的步驟

記數列 ,

則 因為 , ,所以 且 ,所以

所以注意到 ,源區間和目標區間一樣大,再根據單調性必然有因此有要求的 因此

話說我怎麼感覺這題我答過呢

13樓:摺紙

intmain

()if(f

[ptr]==

curr

)else

curr=f

[ptr]+

1;}}

for(

unsignedi=

1;i<

2018;i

++)return0;}

14樓:方慶武

function doBetween(fx, begainX, endX, fxbegain, fxend) {

var diffRange = (fxend - fxbegain)/(endX - begainX);

for(let i=begainX+1; ifx[i] = (i-begainX)*diffRange + fxbegain;

function calcNum(num) {

var fx =;

var curNum = 2;

// 由 f(x+1) > f(x), f(f(x)) == 3x 得出 f(x) >= x

fx[0] = 0;

fx[1] = 2;

fx[2] = 3;

while(curNum < num) {

f(f(x)) = 3x可得

fx[fx[curNum]] = 3*curNum;

doBetween(fx, curNum, fx[curNum], fx[curNum], fx[fx[curNum]]); //之間的資料可推斷出是等差數列

curNum = fx[curNum];

return fx[num];

calc(2017)

可以用js執行

一道數學題,怎麼解?急需

200 210 220 230 240 250 260 270 280 290 300 301 310 311 320 321 330 331 340 341 350 351 360 361 370 371 380 381 390 391 400 401 402 410 411 412 420 42...

一道與數學有關的博弈論問題如何思考?

Poincare ACM HDU 2516 include include include using namespace std int fib 233 x mapmp int main fib 1 1 fib 2 1 for int i 3 i 50 i fib i fib i 1 fib i ...

你做過最富有挑戰性和成就感的一道數學題是什麼?

作為乙個學生時代頑劣的渣渣,鬼使神差,高三有過幾次,班上唯一乙個,全校也就幾個做出答案的經歷。被老師表揚的感覺可飛了呢,反正,老師說在上面說這題多難,自己在下面BB,這就挺簡單的一道題呀。然而,現在依然是個渣渣。停留在前天做湯家鳳1800T求極限章節,20到錯了13道的悲傷中。我現在高三,昨天剛剛做...