A题:相当于每个数都可以对应到一个%k意义下的一个数 这些%k相同的数都可以通过加一些k变得相同,所以统计%k哪个最多即可

#include "bits/stdc++.h"
using namespace std;
#define int long long

const int maxn=1e5+10;
int a[maxn];
int n,k;
map<int,int >mp;
signed main()
{
    cin>>n>>k;
    for (int i=1;i<=n;i++)
    {
        cin>>a[i];
        mp[a[i]%k]++;
    }
    int maxx=0;
    for (auto i:mp)
    {
        maxx=max(maxx,i.second);
    }
    cout<<maxx;
}


B题:根据题意可得 当s.size()为奇数时,那么0 1的个数分别是奇数,偶数 (或是偶数,奇数)那么例如这种010100111串,可以先直接把相邻的00变成11 然后0101部分也可变换一下得到11111111 所以 一定是yes,
当s.size()为偶数时,并且0 1的个数都为偶数时,11001010 可以直接类似上面的变换 变成 全1或全0 ,当其中一个是奇数另一个一定也是奇数,那么通过上面的变换最后会多一个0或1 例如110111一定会多一个0
#include "bits/stdc++.h"
using namespace std;
#define int long long

const int maxn=1e5+10;
int a[maxn];
int T;
signed main()
{
    cin>>T;
    while (T--)
    {
        string s;
        cin>>s;
        int num=0;
        for (int i=0;i<s.size();i++)
        {
            if (s[i]=='0')
            {
                num++;
            }
        }
        if (s.size()%2==1) cout<<"Yes"<<endl;
        else
        {
            if (num%2==1) cout<<"No"<<endl;
            else cout<<"Yes"<<endl;
        }
    }
}

C题:直接跑一个堆优化dij 
#include "bits/stdc++.h"
using namespace std;
#define int long long

const int maxn=1e5+10;
int n,m;
int a[2020][2020];
int f(int x,int y)
{
    return x>=1 && y>=1 && x<=n && y<=m;
}
int dx[3]={0,0,1};
int dy[3]={-1,1,0};
struct node{
    int x,y,val,dis;
    bool operator> (const node &t) const
    {
        return dis>t.dis;
    }
};
bool st[2020][2020];
int dis[2020][2020];
signed main()
{
    cin>>n>>m;
    for (int i=1;i<=n;i++)
    {
        for (int j=1;j<=m;j++)
        {
            cin>>a[i][j];
        }
    }
    priority_queue<node,vector<node>,greater<node> >q;
    memset(dis,0x3f,sizeof dis);
    q.push({1,1,a[1][1],0});

    dis[1][1]=0;
    while (q.size())
    {
        auto t=q.top();
        if (t.x==n && t.y==m)
        {
            cout<<t.dis;
            return 0;
        }
        q.pop();
        if (st[t.x][t.y]) continue;
        st[t.x][t.y]=1;
        for (int i=0;i<=2;i++)
        {
            int xx = dx[i];
            int yy = dy[i];
            if (f(t.x + xx, t.y + yy))
            {
                int vall;
                if (a[t.x + xx][t.y + yy] == a[t.x][t.y])
                {
                    vall = 1;
                } else vall = 2;
                if (dis[t.x+xx][t.y+yy]>vall+dis[t.x][t.y])
                {
                    dis[t.x+xx][t.y+yy]=vall+dis[t.x][t.y];
                    q.push({t.x+xx,t.y+yy,a[t.x+xx][t.y+yy],t.dis+vall});
                }
            }
        }
    }
}
D题:
类似小白赛82 C题的状态机模型 有点麻烦但是也算是比较清楚 状态定义和转移在注释内 注意每个状态需要有26个出边 这样检查能保证不重不漏 
#include "bits/stdc++.h"
using namespace std;
#define int long long
const int mod=1e9+7;
int n;
const int maxn=1e6+10;
int dp[maxn][10];
signed main()
{
    cin>>n;

    dp[1][6]=25;
    dp[1][5]=1;
    for (int i=2;i<=n;i++)
    {
        //dp[n][0]表示包含两个red子串的数量
        //dp[n][0]=dp[n-1][0]*26+dp[n-1][1]
        //dp[n][1]表示有一个red子串且结尾是re的数量
        //dp[n][1]=dp[n-1][2];
        //dp[n][2]表示有一个red子串且结尾是r的数量
        //dp[n][2]=dp[n-1][3]+dp[n-1][2]+dp[n-1][1];
        //dp[n][3]表示有一个red子串的数量且结尾是""的数量
        //dp[n][3]=(dp[n-1][3])*25+24*(dp[n-1][1]+dp[n-1][2])+dp[n-1][4];
        //dp[n][4]表示一个red子串都没有且结尾是re的数量
        //dp[n][4]=dp[n-1][5]
        //dp[n][5]表示一个red子串都没有且结尾是r的数量
        //dp[n][5]=dp[n-1][6]+dp[n-1][5]+dp[n-1][4];
        //dp[n][6]表示一个red子串都没有且结尾是""的数量
        //dp[n][6]=24*(dp[n-1][5]+dp[n-1][4])+25*dp[n-1][6]
        dp[i][0]=dp[i-1][0]*26+dp[i-1][1];
        dp[i][1]=dp[i-1][2];
        dp[i][2]=dp[i-1][3]+dp[i-1][2]+dp[i-1][1];
        dp[i][3]=(dp[i-1][3])*25+24*(dp[i-1][1]+dp[i-1][2])+dp[i-1][4];
        dp[i][4]=dp[i-1][5];
        dp[i][5]=dp[i-1][6]+dp[i-1][5]+dp[i-1][4];
        dp[i][6]=24*(dp[i-1][5]+dp[i-1][4])+25*dp[i-1][6];
        for (int j=0;j<=6;j++)
        {
            dp[i][j]%=mod;
        }
    }
    cout<<(dp[n][0]+mod)%mod;

}