字首和 與 inline內聯函式定義

2021-10-13 22:51:09 字數 1965 閱讀 6861

題目描述

給定乙個長度為 nnn 的數列 a1,a2,a3,…,ana_1,a_2,a_3,\dots,a_na1​,a2​,a3​,…,an​。

現在你要求出乙個長度為 nnn 的數列

b1,b2,b3,…,bnb_1,b_2,b_3,\dots,b_nb1​,b2​,b3​,…,bn​,滿足

bk=∑i∣kaib_k=\sum_a_i bk​=i∣k∑​ai​

由於某些神秘原因,這裡的 bkb_kbk​ 要對 2322^232 取模。

輸入格式

為了避免過大的輸入,本題的輸入使用隨機數生成器。輸入中只有一行兩個整數 n,seedn,seedn,seed。其中 seedseedseed 為 323232 位無符號整數,用來生成資料。接下來,你要呼叫 nnn 次隨機數生成器,分別生成 a1∼ana_1\sim a_na1​∼an​。

對於c/c++選手,生成器模板如下:

#define uint unsigned int

uint seed;

inline uint getnext()

注意:所有 nnn 個數均為 323232 位無符號整數。

輸出格式

為了避免過大的輸出,你只需輸出乙個 323232 位無符號整數,表示所有 bib_ibi​ 的異或和。

輸入

5 1477

輸出

題解

#include

#define uint unsigned int

using

namespace std;

uint seed;

inline uint getnext()

uint num[

30000000

],t[

30000000

],prim[

30000000

],pri[

30000000

],cnt,ans;

intmain()

}for

(uint i=

1;i<=n;i++

) cout<}

其中,inline用於宣告內聯函式,內聯函式作用可以省去函式呼叫的開銷,編譯器會將內聯函式複製展開。

- inline定義與性質

定義

當函式被宣告為內聯函式之後,編譯器會將其內聯展開,而不是按通常函式呼叫。

性質

只有當函式只有10行甚至更少時才將其定義為內聯函式

內聯以**膨脹(拷貝)為代價,僅僅省去了函式呼叫的開銷。

函式呼叫開銷:引數壓棧、跳轉、退棧和返回等操作,不包括執行函式體的開銷

關鍵字 inline 必須與函式定義體放在一起才能使函式成為內聯,僅將 inline 放在函式宣告前面不起任何作用。

// 如下風格的函式 foo 不能成為內聯函式:

inline

void

foo(

int x,

int y)

;// inline 僅與函式宣告放在一起

void

foo(

int x,

int y)

// 而如下風格的函式 foo 則成為內聯函式:

void

foo(

int x,

int y)

;inline

void

foo(

int x,

int y)

// inline 與函式定義體放在一起

詳細inline

inline 內聯函式

一 inline關鍵字用來定義乙個類的內聯函式,引入它的主要原因是用它替代c中表示式形式的巨集定義。表示式形式的巨集定義一例 define expressionname var1,var2 var1 var2 var1 var2 為什麼要取代這種形式呢,且聽我道來 1 首先談一下在c中使用這種形式巨...

inline內聯函式

技術類筆試題50 都會問巨集與inline的區別,自己去找找看?1 巨集替換發生在預編譯 2 巨集函式 如果可以這麼叫的話 替換時不會檢查引數,inline函式會檢查 3 巨集一定會發生替換,inline貌似不是強制的,編譯器想不替換也沒關係 4 巨集替換時存在著一些不可避免的陷阱 參見c trap...

inline內聯函式

一 內聯函式 內聯函式是指用inline關鍵字修飾的函式 它與普通函式所不同之處只在於函式呼叫的處理。普通 函式進行呼叫時,要將程式執行權轉到被呼叫函式中,然後再返回到呼叫它的函式中 內聯函式不是在呼叫時發生執行權轉移,而是在編譯時將 函式 體 嵌入在每乙個呼叫處。編譯時類似巨集替換,使用 函式體替...