<>A 卡片

<>题目描述

<>思路简述

<>代码
#include<bits/stdc++.h> using namespace std; typedef long long LL; typedef
unsigned long long uLL; const int inf=0x3f3f3f3f; const int maxn=1e5+5; const
int N=6e6+5; const LL mod=998244353; const double pi=acos(-1); int n,ans,cnt[15]
,f=1; int main() // 3181 { scanf("%d",&n); //2021 for(int i=0;i<=9;i++) cnt[i]=n
; for(int i=1;i<=inf&&f;i++) { int now=i; while(now) { if(cnt[now%10]) cnt[now%
10]--; else f=0; now/=10; } if(f) ans=i; } printf("%d\n",ans); return 0; }
<>参考结果

3181

<>B 直线

<>题目描述

<>思路简述

<>代码
#include<bits/stdc++.h> using namespace std; typedef long long LL; typedef
unsigned long long uLL; const int inf=0x3f3f3f3f; const int maxn=5e6+5; const
int N=1e7+15; const LL mod=998244353; const double eps=1e-7; const double pi=
acos(-1); int n,m; struct node{ double k,b; node(double kk,double bb) { k=kk,b=
bb; } friend bool operator < (node x,node y){ if(fabs(x.k-y.k)<eps) return x.b<y
.b; return x.k<y.k; } }; set<node>s; void solve(int a,int b,int c,int d) { if(a
==c&&b==d) return; if(a==c)//x=a; { if(s.find(node(1.0*inf,1.0*a))!=s.end())
return; s.insert(node(1.0*inf,1.0*a)); } else //y=kx-ka+b; { double kk=1.0*(d-b)
/(c-a); double bb=1.0*kk*a-b; if(s.find(node(kk,bb))!=s.end()) return; s.insert(
node(kk,bb)); } } int main() //20 21 { scanf("%d%d",&n,&m); for(int a=0;a<n;a++)
for(int b=0;b<m;b++) for(int c=0;c<n;c++) for(int d=0;d<m;d++) solve(a,b,c,d);
printf("%d\n",s.size()); return 0; }
<>参考结果

48953 ？ 应该错了

<>C 货物摆放

<>题目描述

1 1 4；1 4 1；1 1 4；1 2 2；2 1 2；2 2 1 六种分法

<>思路简述

2021041820210418
2 3 3 3 17 131 2857 5882353

<>代码
#include<bits/stdc++.h> using namespace std; typedef long long LL; typedef
unsigned long long uLL; const int inf=0x3f3f3f3f; const int maxn=5e6+5; const
int N=1e7+15; const LL mod=998244353; const double pi=acos(-1); struct node{ int
a,b,c; node(int aa,int bb,int cc) { a=aa,b=bb,c=cc; } friend bool operator < (
node x,node y){ if(x.a==y.a) { if(x.b==y.b) return x.c<y.c; return x.b<y.b; }
return x.a<y.a; } }; set<node>s; LL n,x[5]; int cnt,prime[maxn],res; bool
is_prime[N],f[maxn]; vector<LL>mid; void __prime() { for(int i=1;i<=N-5;i++)
is_prime[i]=1; is_prime[1]=0; for(int i=2;i<=N-5;i++) if(is_prime[i]) { prime[++
cnt]=i; for(int j=i;j<=N-5;j+=i) is_prime[j]=0; } } /* 2021041820210418 2 3 3 3
17 131 2857 5882353 */ void fen(){ LL now=n; for(int i=1;i<=cnt;i++) while(n%
prime[i]==0) n/=prime[i],mid.push_back(1LL*prime[i]); } void dfs(int ff,int now,
LL mul) { if(now==mid.size()) { x[ff]=mul; if(ff==1) { x[2]=n/x[1]/x[0]; if(s.
find(node(x[0],x[1],x[2]))!=s.end()) return; s.insert(node(x[0],x[1],x[2])); res
++; } else dfs(ff+1,0,1); return; } if(f[now]==0) { f[now]=1; dfs(ff,now+1,mul*
mid[now]); f[now]=0; dfs(ff,now+1,mul); } else dfs(ff,now+1,mul); } int main() {
__prime(); scanf("%lld",&n); fen(); for(int i=0;i<mid.size();i++) printf("%d ",
mid[i]); printf("\n"); dfs(0,0,1); printf("%d\n",res); return 0; }
<>参考结果

2430

<>D 路径

<>问题描述

<>思路简述

<>代码
#include<bits/stdc++.h> using namespace std; typedef long long LL; typedef
unsigned long long uLL; const int inf=0x3f3f3f3f; const int maxn=1e5+5; const
int N=6e6+5; const LL mod=998244353; const double pi=acos(-1); int gcd(int a,int
b){ if(b==0) return a; return gcd(b,a%b); } struct node{ int u,v,w; node(int uu
,int vv,int ww) { u=uu,v=vv,w=ww; } }; int n,dis[maxn]; vector<node>g; int main(
) { scanf("%d",&n); for(int i=1;i<=n;i++) dis[i]=inf; dis[1]=0; for(int i=1;i<=n
;i++) for(int j=i+1;j<=n;j++) { if(j-i>21) continue; g.push_back( node( i , j ,
i*j/gcd(i,j) ) ); } for(int i=1;i<=n-1;i++) { bool f=0; for(int j=0;j<g.size();j
++) { int u=g[j].u,v=g[j].v,w=g[j].w; if(dis[v]>dis[u]+w) f=1,dis[v]=dis[u]+w; }
if(f==0) break; } printf("%d\n",dis[n]); return 0; }
<>参考结果

10266837

<>E 回路计数

<>F 砝码称重

<>问题描

<>思路简述

<>代码
#include<bits/stdc++.h> using namespace std; typedef long long LL; typedef
unsigned long long uLL; const int inf=0x3f3f3f3f; const int maxn=1e3+5; const
int N=3e5+5; const LL mod=998244353; const double pi=acos(-1); vector<int>mid;
int n,res,a[maxn],sum,f[N]; int main() { scanf("%d",&n); for(int i=1;i<=n;i++)
scanf("%d",&a[i]),sum+=a[i]; for(int i=1;i<=n;i++) { mid.clear(); mid.push_back(
sum+a[i]); mid.push_back(sum-a[i]); for(int j=0;j<=2*sum;j++) if(f[j]) { if(j-a[
i]>=0) mid.push_back(j-a[i]); mid.push_back(j+a[i]); } for(int j=0;j<mid.size();
j++) f[mid[j]]=1; } for(int i=sum+1;i<=2*sum;i++) if(f[i]) res++; printf("%d\n",
res); return 0; }
<>G 异或数列

<>问题描述

A和B两个人在玩游戏，初始时两人分别有一个数a、b，给出一个数组x，每回合轮到的那人可以做两种操作，选出来一个数异或a或者异或b，每个数只能用一次。A先手，多组输入输出。

<>思路简述

<>代码
#include<bits/stdc++.h> //样例都没得测 using namespace std; typedef long long LL;
typedef unsigned long long uLL; const int inf=0x3f3f3f3f; const int maxn=1e5+5;
const int N=6e6+5; const LL mod=998244353; const double pi=acos(-1); int cnt[30]
,bit[30],n,t,x; int solve() { for(int i=25;i>=0;i--) if(cnt[i]%2) return 0*
printf("1\n"); return 0*printf("0\n"); } int main() { scanf("%d",&t); for(int i=
0;i<=25;i++) bit[i]=1<<i; while(t--) { scanf("%d",&n); memset(cnt,0,sizeof(cnt))
; for(int i=1;i<=n;i++) { scanf("%d",&x); for(int i=25;i>=0;i--) if(x>=bit[i]) x
-=bit[i],cnt[i]++; } solve(); } return 0; }
<>H 左孩子右兄弟

<>问题描述

<>思路简述

<>代码

#include<bits/stdc++.h> using namespace std; typedef long long LL; const int
inf=0x3f3f3f3f; const int maxn=2e5+5; int n; vector<int>g[maxn]; int dfs(int u)
{ int mx=0,sz=g[u].size(); for(int i=0;i<sz;i++) mx=max(mx,dfs(g[u][i])+sz-1);
return mx+1; } int main() { scanf("%d",&n); for(int i=2,u;i<=n;i++) { scanf("%d"
,&u); g[u].push_back(i); } printf("%d\n",dfs(1)-1); return 0; }
<>I 括号序列

<>J 分果果

<>问题描述

n种糖果，m个人，每种糖果最多分两次，最少分一次，每个人都要分到，且只能分到连续的糖果。

<>思路简述

<>代码