签到场……
ABC
签到
D
设等差数列位[s+1,...,s+t],则和为t(2s+t+1)/2=n,也就是t(2s+t+1)=2n,枚举2n的因子t,判断(2n)/t是否为奇数即可,记得每次+2(因为[-i,...,i]=0)

#include<bits/stdc++.h> using namespace std; typedef long long ll; ll n; int ans; void solve(ll x) { ll tmp=n/x; if(tmp%2)ans+=2; } int main() { cin>>n; n*=2; for(ll i=1;i*i<=n;i++) if(n%i==0) { solve(i); if(i*i<n)solve(n/i); } cout<<ans; }
E
将每条限制视为一条边即可,然后预处理k个点到其他点的最短距离,然后状压DP即可

#include<bits/stdc++.h> using namespace std; const int N=1e5+7; int n,m,k,c[20],mp[20][20],f[1<<17][17],d[N]; vector<int>G[N]; struct node{int u,d;}; bool operator<(node a,node b){return a.d>b.d;} priority_queue<node>q; void dijkstra(int s) { for(int i=1;i<=n;i++)d[i]=1e9; d[s]=0,q.push((node){s,0}); while(!q.empty()) { node u=q.top();q.pop(); if(d[u.u]!=u.d)continue; for(int i=0;i<G[u.u].size();i++) if(d[G[u.u][i]]>d[u.u]+1) d[G[u.u][i]]=d[u.u]+1,q.push((node){G[u.u][i],d[G[u.u][i]]}); } } int main() { scanf("%d%d",&n,&m); for(int i=1,x,y;i<=m;i++)scanf("%d%d",&x,&y),G[x].push_back(y),G[y].push_back(x); scanf("%d",&k); for(int i=0;i<k;i++)scanf("%d",&c[i]); for(int i=0;i<k;i++) { dijkstra(c[i]); for(int j=0;j<k;j++)mp[i][j]=d[c[j]]; } for(int i=0;i<k;i++) for(int j=0;j<k;j++) if(mp[i][j]==1e9){puts("-1");return 0;} for(int i=1;i<(1<<k);i++)for(int j=0;j<k;j++)f[i][j]=1e9; for(int i=0;i<k;i++)f[1<<i][i]=1; for(int S=0;S<(1<<k);S++) for(int i=0;i<k;i++)if((S>>i)&1) for(int j=0;j<k;j++)if(!((S>>j)&1))f[S|1<<j][j]=min(f[S|1<<j][j],f[S][i]+mp[i][j]); int ans=1e9; for(int i=0;i<k;i++)ans=min(ans,f[(1<<k)-1][i]); printf("%d",ans); }
F
签到,树状数组裸题
小号打的,45min不到AK才rank105,好在performance=2400满了,rating+=234,now rating=1627