1. T4

  2. 前缀和+哈希表,遍历右端点寻找左端点,mp[sum[b[i]k];mp[sum[b[i]-k];
#include<bits/stdc++.h>
using namespace std;
unordered_map<long long,int> mp;
long long n,k;
int a[200003];
long long b[200003];
int main(){
   freopen("tjqj.in","r",stdin);
   freopen("tjqj.out","w",stdout);
   cin>>n>>k;
   for(int i=1;i<=n;i++){ 
   cin>>a[i];
   b[i]=b[i-1]+a[i];
   }
   mp[0]=1;
   long long ans=0;
   for(int i=1;i<=n;i++){
      if(mp[b[i]-k]) ans+=mp[b[i]-k];
      mp[b[i]]++;
   }
   cout<<ans;
   return 0;
}
  1. T5

对于每一个城市进行DFS,标记能到达的所有城市,再累加答案

#include<bits/stdc++.h>
using namespace std;
vector<int> v[2002];
bool vis[2002];
int n,m;
void dfs(int x){
    if(vis[x]) return ;
    vis[x]=1;
    for(auto a : v[x]) dfs(a);
}
int main(){
    freopen("lx.in","r",stdin);
    freopen("lx.out","w",stdout);
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        int x,y;
        cin>>x>>y;
        v[x].push_back(y);
    }
    long long ans=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++) vis[j]=0;
        dfs(i);
        for(int k=1;k<=n;k++){
            if(vis[k]) ans++;
        }
    }
    cout<<ans;
    return 0;
}
  1. T6

  2. dp[i][j][k]dp[i][j][k] :从前i个数中选j个数,和对j求余为k

  3. 第一层循环: k [1,n] 最多取k个数

  4. 第二层循环: i [1,n] 在前i个数中

  5. 第三层循环: j (0-k] 实际取j个数

  6. 第四次循环: l [0-k) 余数

  7. 不选:f[i+1][j][l]=(f[i+1][j][l]+f[i][j][l])%mod

    选: f[i+1][j+1][(l+a[i])%k]=(f[i+1][j+1][(l+a[i])%k]+f[i][j][l])%mod

#include<bits/stdc++.h>
using namespace std;
int a[102];
int f[102][102][102];
int mod=998244353;
int n; 
int main(){
  freopen("hate.in","r",stdin);
  freopen("hate.out","w",stdout);
    cin>>n;
    for(int i=1;i<=n;i++){ 
    cin>>a[i];
    }
    int ans=0;
   
    for(int k=1;k<=n;k++){
    	memset(f,0,sizeof f);
    	f[1][0][0]=1;
        for(int i=1;i<=n;i++){
            for(int j=0;j<=k;j++){
                for(int l=0;l<k;l++){
                 f[i+1][j][l]=(f[i+1][j][l]+f[i][j][l])%mod;
                 if(j<k){
                    f[i+1][j+1][(l+a[i])%k]=(f[i+1][j+1][(l+a[i])%k]+f[i][j][l])%mod;
                 }
                }
            }
        }
        ans+=f[n+1][k][0];
        ans%=mod;
    }
    cout<<ans;
    return 0;
}