比较简单的一道数学题。
思路:
- 计算小组赛的比赛总数。
long long stage1 = G * T * (T-1) / 2;
每组有 \(T\) 个队伍,每个队伍都需要与其他 \(T-1\) 个队伍比赛,共有 \(T\cdot(T-1)\) 场比赛。共有 \(G\) 组,因此小组赛总比赛数为 \(\frac{G\cdot T\cdot(T-1)}{2}\)。
- 计算进入淘汰赛的队伍总数。
long long teams = G * A + D;
小组赛每组晋级 \(A\) 支队伍,共 \(G\cdot A\) 支队伍,再加上 \(D\) 支直接晋级的队伍,总数为 \(G\cdot A+D\)。
- 计算晋级淘汰赛的队伍数调整到最接近的2的幂。
long long newteams = teams == 1 ? 1 : 1ll << (64 - __builtin_clzll(teams - 1));
teams
为 \(1\) 时,newteams
也设为 \(1\)。- 否则,通过位操作找到大于等于
teams
的最小 \(2\) 的幂。 __builtin_clzll(x)
是 GCC 提供的一个内置函数,用于计算一个long long
类型的数从最高有效位到第一个 1 之间的零的数量。1ll << (64 - __builtin_clzll(teams - 1))
通过左移操作计算大于等于teams
的最小 \(2\) 的幂。
代码:
#include<bits/stdc++.h>
#define wrhlovezcx true
using namespace std;
int main() {
while(wrhlovezcx){
long long G,T,A,D;
scanf("%lld %lld %lld %lld",&G,&T,&A,&D);
if (G==-1) return 0;
printf("%lld*%lld/%lld+%lld=",G,A,T,D);
long long stage1=G*T*(T-1)/2;
long long teams=G*A+D;
long long newteams=teams==1?1:1ll<<(64-__builtin_clzll(teams-1));
printf("%lld+%lld\n",stage1+newteams-1,newteams-teams);
}
}
标签:good,cdot,题解,Sometimes,long,teams,队伍,newteams,lld
From: https://www.cnblogs.com/cly312/p/18444913