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=1mC(m,i)∗2i。
又根据二项展开式:
令x=2,有 ∑i=1mC(m,i)∗2i=3^n
根据乘法原理,对于每一个后缀,其结果为:
2^n * ∑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;
}