先检讨一下这一次 虽然说本来就菜 也写不出几题 但是这次因为心态爆炸最后只过了一题 实在是不行 因为那个汉诺塔问题调试的时候老是出现状况 所以我就裂开了 导致后面写较为简单的题目也没有写出来
H题
先从H题开始 这里在看别人的代码时看到了一个没有见过的输入方式 在后面的博客里会补充 这里就不多加赘述,先贴代码

#include<bits/stdc++.h>
using namespace std;
int g[100005],h[100005],n,m,t;
bool f[100005];
inline int read()               //这个就是我看到的新的读取方法
{
    int x=0;char ch=getchar();
    while (ch>'9'||ch<'0') ch=getchar();
    while (ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    return x;
}

int main(void)
{
    n=read();
    m=read();
    for (int i=2;i<=n;i++)           //这一个循环标记小于等于n的合数
        if (!f[i])
        {
            t=i+i;
            while (t<=n)
                f[t]=1,t+=i;
        }
    for (int i=2;i<=n;i++)         //这一个循环计算每一个合数的合子
        if (f[i])                 //这里的意思的比如i等于4 4是4的一个因子 然后4加4等于8
        {                        //所以4也是8的因子 再加4等于12 所以也是12的因子 如此计算
            t=i;
            while (t<=n)
                g[t]++,t+=i;
        }
    for (int i=1;i<=n;i++)           //这里就是统计每种合数的个数
        h[g[i]]++;
    while (m--)
        printf("%d\n",h[read()]);
    return 0;
}

补一个埃氏筛再这里
这个是模板

#include <iostream>
using namespace std;
const int N = 10005;
int prime[N];  //第i个素数
bool is_prime[N+1];  //is_prime[i]为true时表示i是素数

int sieve(int n) {//返回n以内素数的个数
    int p = 0;
    for(int i = 0; i <= n; i++) is_prime[i] = true;
    is_prime[0] = is_prime[1] = false;
    for(int i = 2; i <= n; i++) {
        if(is_prime[i]) {
            prime[p++] = i;
            for(int j = 2*i; j <= n; j+=i) is_prime[j] = false;  //筛去所有素数的倍数
        }
    }
    return p;
}

int main() {
    int n;  //枚举n以内素数
    while(cin>>n) {
        int p = sieve(n);
        cout<<p<<endl;
        for(int i = 0; i < p; i++)
            cout<< prime[i]<<" ";
        cout<<endl;
    }
    return 0;
}

这个题目是找合数 所以要改一下标记
这是通过代码

#include <bits/stdc++.h>
using namespace std;
const int N =100007;
bool is_prime[N+1];
int cnt[N];
void sieve(int n)   //标记所有素数
{
    for(int i = 0; i <= n; i++)
        is_prime[i] = true;
    is_prime[0] = is_prime[1] = false;
    for(int i = 2; i <= n; i++)
    {
        if(is_prime[i])
        {
            for(int j = 2*i; j <= n; j+=i) is_prime[j] = false;
        }
    }
    return ;
}
int jishu(int n)      //统计的合数
{
    int factor[N],m=0;
    for(int i=1;i<=n/i;i++)
    {
        if(n%i==0)
        {
            factor[++m]=i;
            if(i!=n/i)factor[++m]=n/i;
        }
    }
    int ans=m;
    for(int i=1; i<=m; i++)
        if(is_prime[factor[i]]) ans--;
    return ans;
}
int main(void) {
    int n,m;
    cin>>n>>m;
        sieve(n);
    int k;
    for(int i=4; i<=n; i++)
    {
        if(!is_prime[i]) cnt[jishu(i)-1]++;  
    }
    while(m--){
        cin>>k;
        cout<<cnt[k]<<endl;
    }
    return 0;
}

F题
题意差不多就是有一个01串 输出所有1之间的距离的总和
先贴代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const long long mod=1e9+7;
int a[100005];
ll b[100005];
int main(void)
{
    int n,i,j,cut=0;
    char ch;
    ll sum=0;
    cin>>n;
    getchar();
    for(i=1;i<=n;i++)
    {
        ch=getchar();
        if(ch=='1')
        {
            a[++cut]=i;            //记录每一个1的位置
            if(cut!=1)
                b[cut]=(b[cut-1]+(a[cut]-a[cut-1])*(cut-1))%mod; //算出每一个点与前面所有点的距离
        }
    }
    for(i=2;i<=cut;i++)
        sum=(sum+b[i])%mod;
    printf("%lld\n",sum);
    return 0;
}

A题
先贴代码 走迷宫的题目我之前学了一小段时间 还是不会
思路很简单 就是递推 是d的话就下推 r的话就往右推 b就是上下都推 最后输出递推到终点的值

#include<bits/stdc++.h>
using namespace std;
const int MAXN=55;
const long long mod=1e9+7;
long long dp[MAXN][MAXN];
char mp[MAXN][MAXN];
int n,m;
int main(void)
{
    ios::sync_with_stdio(false);
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        cin>>mp[i]+1;
    dp[1][1]=1;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(mp[i][j]=='D')
                dp[i+1][j]=(dp[i+1][j]+dp[i][j])%mod;
            if(mp[i][j]=='R')
                dp[i][j+1]=(dp[i][j+1]+dp[i][j])%mod;
            if(mp[i][j]=='B')
            {
                dp[i+1][j]=(dp[i+1][j]+dp[i][j])%mod;
                dp[i][j+1]=(dp[i][j+1]+dp[i][j])%mod;
            }
        }
    }
    cout<<dp[n][m]<<endl;
    return 0;
}

B题
题解非常牛逼 真的是长见识了 我直接把题解的代码抄过来 然后写一下
题解的意思就是构建一个二进制编码器

#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
int i,i0,n,m,ans,k;
char mp[55][55];
int main()
{
    n=32,m=30;
    scanf("%d",&k);
    mp[n][m]='B';
    for(int i0=1;i0<=m;i0++)mp[1][i0]=(i0<=2)?'B':'R';
    for(int i=2;i<=n-1;i++)
    {
        for(int i0=1;i0<=m;i0++)
        {
            if(i0<i-1)mp[i][i0]='D';
            else if(i0<i+2)mp[i][i0]='B';
            else mp[i][i0]='R';
        }
    }
    for(int i0=1;i0<=m;i0++)
    {
        if(!(k&(1<<(i0-1))))mp[i0+1][i0]='R';
        mp[n][i0]='R';
    }
    printf("%d %d\n",n,m);
    for(int i=1;i<=n;i++)printf("%s\n",mp[i]+1);
    return 0;
}

I题
嗯。。。。。调试了很多次 我心态还是炸了 直接贴一个代码 找规律 然后过了

#include <iostream>
using namespace std;
typedef long long ll;
ll m=0,n=0,p=0,c=1,x;
int main()
{
    cin>>x;
    for (ll i=2; i<=x; i++)
    {
        if (i&1)
        {
            n=m+p;
            c=p+p+1;
        }
        else
        {
            p=n+c;
            m=n+n;
        }
    }
    cout<<"A->B:"<<p<<'\n';
    cout<<"A->C:"<<c<<'\n';
    cout<<"B->A:"<<n<<'\n';
    cout<<"B->C:"<<p<<'\n';
    cout<<"C->A:"<<m<<'\n';
    cout<<"C->B:"<<n<<'\n';
    cout<<"SUM:"<<(1LL<<x)-1<<endl;
}

E题

还想写E题 但是我已经死了
你觉得我会吗 我看了题解也不会 哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈