新生賽補題

2022-07-03 03:21:26 字數 1795 閱讀 2786

題目大意:構造乙個長度為n的嚴格遞增序列,每個數都屬於【1,m】。求方案數,結果模998244353。

dp的轉移方程:

第一位數 i 代表的是遍歷到第幾個數了,j代表的是當前位是幾。

$$dp[i][j]=dp[i-1][j]+dp[i][j-1]

$$ac**:

#include using namespace std;

const int maxn = 3e3+5;

typedef long long ll;

ll dp[maxn][maxn];

const ll mod = 998244353;

int main()

} int ans=0;

for(int i=1;i<=m;i++)

cout

題目大意:現在存在 1 - n 這 n 個數,將這n個數分成兩組,使得兩組得到的兩組的加和的數的最大公約數是最大的。

例:n=6, 左邊一組:1 6 2 5 =14

​ 右邊一組: 3 4 =7 所以最大是7

解題思路:根據多重揹包的思想,很容易想出,1到sum(1到n的加和)的所有數都可以在一邊表示出來。

題目就轉換成了:將乙個數分成兩個數,使兩個數的最大公約數是最大的。 1 - n的數的加和為 n(n+1)/2。

​ n(n+1)/2 的最大公約數肯定是

​ minf(n)表示求出n的最大公約數。

注意特判一下n==2的情況。

ac**:

#include #include using namespace std;

typedef long long ll;

ll minf(ll x)

} return 1;

}int main()

}x = 14時 x 1110

​ x - 1 1101 相當於把第乙個1後面的數翻轉了一次:0 -> 1    1 -> 0,當&操作時變為0

x&(x-1) 1100

lowbit得到第乙個1的位置

int lowbit(int x)
x = 6時 x 110

​ -x 010

x&(-x) 010

題目大意:存在三種操作,自己看題吧。預處理一下就過了,,迷

ac**:

#include using namespace std;

const int maxn = 1e5+5;

int s[maxn];

int a[maxn];

int get(int x)

return cnt;

}int main()else

} int n,q;

scanf("%d%d",&n,&q);

for(int i=1;i<=n;i++)

int ch,l,r,x,y;

while(q--)

printf("%d\n",ans);

}else if(ch==2)

}else

} return 0;

}

2020第一賽 新生賽002 補題

這次只出了一道題 不可能告訴你們呢道題是簽到題 然後是愉快的補題時間 如下 nbut 1609 題幹傳送門 題意 是在乙個座標軸上求乙個梯形的面積 可以把這個梯形分成兩個同底不同高的兩個三角形附 思路 include include int main return 0 nbut 1666 題幹傳送門...

新生賽002(涼心的比賽)補題

這次又寫了簽到題 codeforces 976a 題幹傳送門 題意 其實只需要得出0和1的數目 然後輸出乙個1和所有的0即可 include include include include using namespace std int n string s int main str maxn bo...

新生賽心得

新生賽發揮正常,rank8。心情感受 比賽前 學長 們說送熱水袋開心剛好缺乙個熱水袋有了上次藍橋杯選拔賽爆零的經驗,這次真的就是想打完就跑最好那個熱水袋,總之就是很輕鬆。結果最後拿了rank8看到白書!好想要,但是被前面的人拿走了,後來上台的時候大概是acm女生太少了所以男生就比較起鬨我就懵了,隨便...