L-Who is the Champion:
签到题,但题目里面的净胜球数,看了半天。sort排序。

#include <bits/stdc++.h>
using namespace std;
struct node
{
    int num,score,goal;//净胜球数
}team[110];
bool cmp(node a,node b)
{
    if(a.score==b.score)
        return a.goal>b.goal;
    return a.score>b.score;
}
int pic[110][110];
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            scanf("%d",&pic[i][j]);
    if(n==1)
    {
        printf("1\n");
        return 0;
    }
    for(int i=1;i<=n;i++)
    {
        team[i].num=i;
        for(int j=1;j<=n;j++)
        {
            if(i==j)
                continue;
            if(pic[i][j]>pic[j][i])
            {
                team[i].score+=3;
                team[i].goal+=(pic[i][j]-pic[j][i]);
            }
            else if(pic[i][j]==pic[j][i])
                team[i].score++;
            else if(pic[i][j]<pic[j][i])
                team[i].goal+=(pic[i][j]-pic[j][i]);
        }
    }
    sort(team+1,team+1+n,cmp);
    if(team[1].score==team[2].score&&team[1].goal==team[2].goal)
        printf("play-offs\n");
    else
        printf("%d\n",team[1].num);
    return 0;
}

C. And and Pair:
推公式的题,可惜就是推不出。
数位dp的做法也不会。
ss为n的二进制表示。
1.首先,从后面开始处理,对于ss的每一个以1开头的后缀,以其第一位的1为i的第一位,那么对应的 j 的第一位必然为0,不管后面如何取值,都可以满足j<=i。
2.假设该后最中有m个1,n个0。
对于0位而言,i 中对应为必然为0,因此 j 中对应为可以为0/1。有2^n种可能。
对于1位而言,如果 i 中对应位为1,那么 j 中对应位必然为0。如果 i 中对应位为0,那么 j 中对应位为0/1。有组合数学知识,可知,有 i = 1 m C ( m , i ) 2 i \sum_{i=1}^{m}C(m,i)*2^i i=1mC(m,i)2i
又根据二项展开式:

令x=2,有 i = 1 m C ( m , i ) 2 i \sum_{i=1}^{m}C(m,i)*2^i i=1mC(m,i)2i=3^n
根据乘法原理,对于每一个后缀,其结果为:
2^n * i = 1 m C ( m , i ) 2 i \sum_{i=1}^{m}C(m,i)*2^i i=1mC(m,i)2i
最后累加求和,记得+1,考虑(0,0)的情况。
题解及推导过程

#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
typedef long long ll;
const int mod=1e9+7;
char ss[N];
ll qpow(ll a,ll b)
{
    ll res=1;
    while(b)
    {
        if(b&1)
            res=res*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return res%mod;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s",ss);
        int len=strlen(ss);
        ll ans=0;
        int num1=0,num0=0;
        for(int i=len-1;i>=0;i--)
        {
            if(ss[i]=='1')
            {
                ans=(ans+qpow((ll)2,(ll)num0)*qpow((ll)3,(ll)num1)%mod)%mod;
                num1++;
            }
            else
                num0++;
        }
        ans++;
        printf("%lld\n",ans%mod);
    }
    return 0;
}