#include<iostream> usingnamespace std; #define MAXN 210 #define MAXM 7 int n,k; intclassmateL(int n, int k, int min){ //cout<<"Stepping In "<<n<<" "<<k<<endl; if(k == 1){ return1; } int ans = 0; for(int i = min; i <= n / k; ++ i ){ ans += classmateL(n - i, k - 1, i); } //cout<<"Stepping Out "<<n<<" "<<k<<" "<<ans<<endl; return ans; } intmain(){ cin>>n>>k; cout<<classmateL(n,k,1); return0; }
正解并不需要高静. 每次读入 n 的一位, 分别模 p 和 p-1, 算2^(n-1%(p-1))*n%p即可.
F题
不会
G题
水题, 暴力即可. 看错题了导致WA一次
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
#include<iostream> usingnamespace std; intmain(){ int n; cin>>n; int ans = 0; while(n != 1){ if(n%2){ n = 3 * n + 1; }else{ n = n / 2; } ans++; } cout<<ans<<endl; return0; }
H题
并不会, 正解是摩尔投票算法.
I题
DP, 用 count[x][i] 表示第 x 位涂色为 i 所花费的最少钱数.
转移方程: count[x][i] = min(count[x-1][j] + cost[x][j], j!=i) cost[x][j] 表示将 x 涂为颜色 j 所花费的钱.
是线性递推, 可以压缩至一维 dp, 但没必要.