A. Even Substrings
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
scanf("%d",&n);
string s;
cin>>s;
long long ans=0;
for(int i=0;i<n;++i){
if( ! ((s[i]-'0')&1) ) ans += i+1;//如果是偶数,则加上它的位置
}
printf("%lld\n",ans);
}
B. Chocolates
#include<bits/stdc++.h>
using namespace std;
int a[200005];
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;++i){
scanf("%d",&a[i]);
}
long long ans=a[n-1];
for(int i=n-2;i>=0;--i){
if(a[i+1]-1>=a[i]) ans+=a[i];
else a[i]=max(a[i+1]-1,0),ans+=a[i];
}
printf("%lld",ans);
}
C. Edgy Trees
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MOD = 1e9 + 7;
const int MAXV=100005;
vector<int>adj[MAXV];
int n;//n为顶点数,MAXV为最大顶点数
bool vis[MAXV];//如果顶点i已被访问,则vis[i]=true.初值为false
ll poww(ll a, ll b){
ll ans = 1, base = a;
while(b>0){
if(b&1) ans*=base,ans%=MOD;
base*=base,base%=MOD;
b>>=1; //b=b/2
}
return ans%MOD;
}
int main(){
int k;
scanf("%d%d",&n,&k);
int u,v,color;
ll cnt=0,num=0,sum=0;
for(int i=0;i<n-1;++i){
scanf("%d%d%d",&u,&v,&color);
if(!color){
adj[u].push_back(v);
adj[v].push_back(u);
}
}
//BFS数联通块
for(int i=0;i<n;++i){
if(adj[i].size()){
num=1;//该联通块有多少个点
queue<int>q;
if(!vis[i]){//注意
q.push(i);
vis[i]=true;
}
while(!q.empty()){
int top=q.front();
q.pop();
for(int j=0;j<adj[top].size();++j){
if(!vis[adj[top][j]]){
q.push(adj[top][j]);
vis[adj[top][j]]=true;
++num;
}
}
}
if(num!=1){
sum+=poww(num,k);//该联通块内点的数目的k次方
cnt+=num;
sum%=MOD;
}
}
}
ll ans=(poww(n,k)-sum-(n-cnt)+MOD)%MOD;
//答案=所有情况-红区-不在红区的点的数目(不在红区的点,每个点重复自己k遍,是1种不合法的走法)
//注意+MOD再%MOD
cout<<(ans+MOD)%MOD<<endl;
}