#include<iostream>usingnamespace std;typedeflonglong LL;constint N =22, M =1<< N;
LL f[M][N];bool e[N][N];intgcd(int a,int b){return b ?gcd(b, a % b): a;}intmain(){for(int i =1; i <=21; i ++)for(int j =1; j <=21; j ++)if(gcd(i, j)==1)
e[i][j]=true;
f[2][1]=1;for(int i =2; i <= M -2; i ++)for(int j =1; j <=21; j ++)if(i >> j &1)for(int k =1; k <=21; k ++)if(i -(1<< j)>> k &1&& e[k][j])
f[i][j]+= f[i -(1<< j)][k];
LL ans =0;for(int i =2; i <=21; i ++)
ans += f[M -2][i];
cout << ans << endl;return0;}
#include<iostream>#include<algorithm>usingnamespace std;typedeflonglong LL;intmain(){
LL ans =881012367360;
cout << ans << endl;return0;}
砝码称重
#include<iostream>#include<cstring>#include<algorithm>usingnamespace std;constint N =110, M =200010, B = M /2;int n;int w[N];bool f[N][M];intmain(){scanf("%d",&n);for(int i =1; i <= n; i ++)scanf("%d",&w[i]);
f[0][B]=true;for(int i =1; i <= n; i ++)for(int j =0; j <= M ; j ++){if(f[i -1][j]){if(j - w[i]>=0) f[i][j - w[i]]=true;if(j + w[i]<= M) f[i][j + w[i]]=true;
f[i][j]=true;}}int res =0;for(int j = B +1; j <= M; j ++)
res += f[n][j];
cout << res << endl;return0;}
左孩子右兄弟
#include<iostream>#include<cstring>#include<algorithm>#include<vector>usingnamespace std;constint N =100010;
vector<int> g[N];int n;intdfs(int u){int ans =0;int cnt = g[u].size();for(int i =0; i < cnt; i ++){
ans =max(ans,dfs(g[u][i]));}return ans + cnt;}intmain(){
cin >> n;for(int i =2; i <= n; i ++){int x;scanf("%d",&x);
g[x].push_back(i);}int ans =dfs(1);
cout << ans << endl;return0;}
B组
测试次数
#include<iostream>usingnamespace std;#define Max(a,b) (a>b?a:b)intmain(){int dp[4][1005]={0};for(int i =0; i <=1000; i++)
dp[1][i]= i;for(int cnt =2; cnt <=3; cnt++)for(int ind =1; ind <=1000; ind++){int val =10000, max;for(int k =1; k <= ind; k++){
max =Max(dp[cnt-1][k-1], dp[cnt][ind-k])+1;if(val > max) val = max;}
dp[cnt][ind]= val;}
cout<<dp[3][1000];return0;}
快速排序
#include<bits/stdc++.h>usingnamespace std;intquick_select(int a[],int l,int r,int k){int p =rand()%(r - l +1)+ l;int x = a[p];{int t = a[p]; a[p]= a[r]; a[r]= t;}int i = l, j = r;while(i < j){while(i < j && a[i]< x) i++;if(i < j){
a[j]= a[i];
j--;}while(i < j && a[j]> x) j--;if(i < j){
a[i]= a[j];
i++;}}
a[i]= x;
p = i;if(i - l +1== k)return a[i];if(i - l +1< k)returnquick_select( a, i, r, k );//填空 //通过观察对比else的quick_select参数可直接写出结果elsereturnquick_select(a, l, i -1, k);}intmain(){int a[100];int n;
cin>>n;for(int i=0;i<n;i++)
cin>>a[i];
cout<<quick_select(a,0, n-1,5);return0;}
递增三元组
#include<iostream>#include<algorithm>usingnamespace std;intmain(){int a[100005], b[100005], c[100005];longlong n =0, ans =0;longlong i =0, s1 =0, s2 =0;
cin >> n;for(i =0; i < n; i++) cin >> a[i];for(i =0; i < n; i++) cin >> b[i];for(i =0; i < n; i++) cin >> c[i];sort(a, a + n);sort(b, b + n);sort(c, c + n);for(i =0; i < n; i++){//s1 = 0; s2 = 0;while(s1 < n && a[s1]< b[i]) s1++;while(s2 < n && c[s2]<= b[i]) s2++;
ans +=((longlong)s1 *(n - s2));}
cout << ans << endl;return0;}