NOIP提高組模擬賽14

2022-09-22 22:03:23 字數 2746 閱讀 6719

這種題就是打表,什麼性質不性質的不重要

不知道我打錶出的式子怎麼解釋,,

粘一下題解做法吧

"考慮每一位的貢獻,從低到高的第\(i\)位會每隔\(2^i\)個數變化一次,於是第$$i位對答案的貢獻就是\(\lfloor\frac\rfloor\),

把每一位的貢獻加起來即可。"

我的**

code

#include using namespace std;

unsigned long long n;

int main()

printf("%llu\n",ans+n);

return 0;

}

考場理解錯了題意,導致送的分都沒拿到

考慮\(n=2\)的情況

設\(dp[i][j]\)表示第一種顏色的球剩\(i\)個,第二種顏色的球剩\(j\)個對手中籌碼的最大貢獻,也可以說是表示你當前有1個籌碼,箱子裡兩種顏色的球分別有\(i,j\)個,你最終能獲得多少籌碼,這個「1」是單位「1」

由於幕後**肯定會按你得籌碼最少的情況掉球,所以在最優策略下,不同的掉球情況下最終所能獲得的籌碼數應該相同

假設你在第一種顏色上押\(x\)個籌碼,在第二種顏色上押\(y\)個籌碼,有\(x\times dp[i-1][j]=y\times dp[i][j-1]\)又有\(x+y=1\)可以解得\(x\)

容易發現全押一定比不押優(\(dp[i][j]>=1\)),於是有\(dp[i][j]=\frac\)

發現那個係數\(2\)看著不好看,而且可以最後再乘上

所以設\(f[i][j]\times 2^=dp[i][j]\)

那麼有\(\frac=\frac+\frac\)

好眼熟,這不是二維圖中只能向右上走的方案數嗎,直接\((^_)\)

答案就是\(\frac}_)}\)

結論可以擴充套件到多維情況

code

#include #include using namespace std;

const int mod=998244353;

const int maxn=1000005;

int n,x[maxn+15];

long long jc[maxn+15],inv[maxn+15];

long long qpow(long long x,long long y)

return ans;

}void ycl()

long long get_c(int n,int m)

int main()

printf("%lld\n",ans*qpow(in,mod-2)%mod);

return 0;

}

題解不做人,給了個錯誤式子。。

正解確實要斯特林數,但是還需要換根\(dp\)

有\(x^k=\sum_^k \begink\\ i\end\times x^\)

\((x+1)^=i\times x^}+x^\)

設\(f[i][j]\)表示\(i\)子樹內到\(i\)距離的\(j\)次下降冪之和,\(g[i][j]\)表示\(i\)子樹內到\(i\)的父親距離的\(j\)次下降冪之和

\(f_=\sum_g_\)

\(g_=j\times f_+f_\)

看碼注釋吧。。

code#include #include using namespace std;

const int maxn=1000005;

const int maxk=105;

const int mod=998244353;

const int inv_2=499122177;//2在%mod意義下的逆元

struct edgee[maxn<<1|1];

int head[maxn],tot,n,k;

void add(int u,int v)

int s[maxk][maxk];//斯特林數

int f[maxn][maxk];//f[x][i]x子樹內所有點到x的距離的i次下降冪之和

int g[maxn][maxk];//g[x][i]x子樹內所有點到x的父親距離的i次下降冪之和

void pre()

void dfs(int x,int fa)

}++f[x][0];

for(int i=k;i;--i)

g[x][i]=(1ll*i*f[x][i-1]%mod+f[x][i])%mod;//x+1的i次下降冪==(x的i-1次下降冪乘以i )+x的i次下降冪

g[x][0]=f[x][0];

}int tmp[maxk],sum[maxk];

//換根dp,統計所有點到當前根的貢獻,每條路徑會被計算兩次,最後需要乘2的逆元

void dfs_get(int x,int fa)

for(int i=head[x];i;i=e[i].net)

}int main()

d[x].dfsr=tmp;

}struct askak[maxn];

int fk[gm][gm],yk[maxn],pos[maxn],ans[maxn];

void work1()

if(ak[i].x!=mod)continue;

if(pos[ak[i].l]==pos[ak[i].r])else

int query(int posi)

}for(int i=dl;i<=dr;++i){

int s=v[i-dl].size();

for(int j=0;j

NOIP提高組模擬賽3

周圍大佬都說初中打過n遍,我乙個菜雞瑟瑟發抖。把斐波那契數列寫出來找了半天性質,用了半個多小時推出來 x兔子的父親,就是x減去是在斐波那契數列中最大的小於x的數 舉個栗子 13號兔子,應減去8,得到他的祖先5 10號兔子,應減去8,得到他的祖先2 預處理出斐波那契數列,然後讓ab中較大的到他的祖先,...

NOIP提高組模擬賽4

丹青千秋釀,一醉解愁腸 無悔少年枉,只願壯志狂 矩陣字首和加暴力 o n 2m 2 60pts有手就行 觀察資料範圍,猜測應該是求一種 o n 3 的演算法,想到之前做的題,應該是 n 2 枚舉行,n 處理乙個序列的答案,然後,就沒有然後了 對於乙個序列,求子段和為k的倍數,如何 o n 求解,考慮...

NOIP提高組模擬賽6

這題看著真熟啊,好像把之前的english,入陣曲雜糅了一下。首先,像入陣曲一樣計算出字首和 s 式子可以轉化為求 s r s l 1 equiv max mod k 像english一樣 用單調棧處理出以x為最大值的區間,分區間求解 每次列舉一側區間,已知max,只要知道另一側有多少與之餘數相同的...