A
签到题 我们可以分析出来符合条件的数是长度为7的区间有一个
于是直接算有多少个区间 在判断一下除以区间后多的一点点范围 看是否有符合条件的
(用1<<n算2的高次会出错....)

#include <bits/stdc++.h>
#define ll long long
const ll N=55;
const ll INF=1e9+5;
using namespace std;
ll n,m,ans;
ll pow2(ll a,ll n){
    ll res = 1;
    while(n){
        if(n&1) res *= a;
        a *= a;
        n >>= 1;
    }
    return res;
}
int main()
{
    ios::sync_with_stdio(false);
    cin>>n>>m;
    n=pow2(2,n);m=pow2(2,m);
    ans=(m-n)/7;
    if(n%7==1&&m%7>1) ans++;
    cout<<ans<<endl;
    return 0;
}

B
真签到 按照题目意思模拟 直接就过了(还以为有什么坑...)

#include <bits/stdc++.h>
#define ll long long
const ll N=55;
const ll INF=1e9+5;
using namespace std;
ll t,n,a,b;
int main()
{
    ios::sync_with_stdio(false);
    cin>>t;
    while(t--)
    {
        ll ans=0;
        cin>>n;
        for(int i=1;i<=n;++i)
        {
            cin>>a>>b;
            ans+=a*b;
        }
        cout<<ans<<endl;
    }
    return 0;
}

C
目前不会这么变态的题目....

D
取石子 直接猜了个奇数石子是分成 1和n-1 n-1与偶数合并 所以奇数石子对答案无贡献
直接统计偶数石子的个数就行了 奇数Bob 偶数Alice 特判一下0个偶数就行了

#include <bits/stdc++.h>
#define ll long long
const ll N=1e4+5;
const ll INF=1e9+5;
using namespace std;
ll n,a[N];
int main()
{
    ios::sync_with_stdio(false);
    cin>>n;
    ll k=0;
    for(int i=1;i<=n;++i)
    {
        cin>>a[i];
        if(a[i]%2==0) k++;
    }
    if(k==0) cout<<"Bob"<<endl;
    else if(k==1) cout<<"Bob"<<endl;
    else if(k%2)cout<<"Bob"<<endl;
    else cout<<"Alice"<<endl;
    return 0;
}

E
比赛时比较难的了(QAQ菜鸡不会算大小 想不到要高精 肯定会wa飞)
解法就是 高精+区间dp
区间dp还是比较套路的 看题目描述在多想一会应该能想到的
设dp[i][j]为ij范围构成三角形的最小值
对于[i,j]这样一个范围 我们怎么求最小 选其中的一点k与首尾构成三角形
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]+a[i] * a[j] * a[k]) 来寻找最优
j-i+1 长度从小到大遍历 k从i+1到j-1遍历
这样就行了 注意相乘会超过ll范围 要使用__int128
(cout输出128还不行 只好用了别人的一个输出板子)

#include <bits/stdc++.h>
#define ll long long
const ll N=55;
const __int128 INF=1e30;
using namespace std;
inline void write(__int128 x) { if (!x) { putchar('0'); return; } char F[40]; __int128 tmp = x > 0 ? x : -x; if (x < 0)putchar('-');    int cnt = 0;    while (tmp > 0) { F[cnt++] = tmp % 10 + '0';        tmp /= 10; }    while (cnt > 0)putchar(F[--cnt]); }
ll n,a[N];
__int128 dp[N][N];
int main() {
    cin>>n;
    for(int i=1;i<=n;++i)cin>>a[i];
    for(int len=3;len<=n;++len)
    {
        for(int i=1;i+len-1<=n;++i)
        {
            int j=i+len-1;
            dp[i][j]=INF;
            for(int k=i+1;k<j;++k)
            {
                dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]+(__int128)a[i]*a[k]*a[j]);
            }
        }
    }
    write(dp[1][n]);
    return 0;
}