我是把他们的公约数求出来,然后求28个td的分数,7个qsjjkktd,8个qsjjkkt,比较分数大小,有人可能觉得这样比较是不是有点草率,其实从数学是,比较的是td,qsjjkkt等模式下,每个英文字母的平均得分,所以其实很合理,然后就是动态规划,要多抽出来56个字符,因为最后一段有可能会有遗漏的几块,不能拼的很完美,如果是重复的周期性的话,一定是一样的最大,最赚,但是现在要多考虑这种情况,因为确实举例子的话是可能出现这种情况的

#include<bits/stdc++.h>
using namespace std;
using ll=long long;

const int N=113;
ll dp[N];
ll c(int m,ll a,ll b){
    for(int i=1;i<=m;i++){
        dp[i]=dp[i-1];
        if(i>=2)dp[i]=max(dp[i],dp[i-2]+b);
        if(i>=7)dp[i]=max(dp[i],dp[i-7]+a);
        if(i>=8)dp[i]=max(dp[i],dp[i-8]+a+b);
    }
    return dp[m];
}
int main(){
    ios::sync_with_stdio(0);cin.tie(0);
    int T;
    cin>>T;
    while(T--){
        ll n,a,b;
        cin>>n>>a>>b;
        ll max1=max({8*a,28*b,7*(a+b)});
        ll m=n%56;
        ll p=m+56;
        ll ans=0;
        if(n>=56){
            ans+=(n-p)/56*max1;
            ans+=c(p,a,b);
        }else{
            ans+=c(n,a,b);
        }
        cout<<ans<<'\n';
    }
    return 0;
}