题意:
给你两个函数
ai sin(2^i * x), 0 ≤ x ≤ 2π, for i = 0, 1, …, S−1,
bj cos(2^j * x), 0 ≤ x ≤ 2π, for j = 0, 1, …, C−1,
现在题目给出 S,C,K 问你,存在多少个点使得,至少有K个函数穿过。
解析:
为什么写这题呢,是因为想让自己记住,当实在想不出怎么做的时候可以,暴力打表找规律。
这题的做法是写了一个暴力程序,让后根据这个程序打出的表找到规律。
至于暴力程序,还是有技巧的。
sin(2^i * x)的0点肯定落在 k * 2^(-i)上
cos(2^j * x) 的0点肯定落在 (2k + 1) * 2^(-j-1)上
(k为整数)
AC代码
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
const int N = 52;
ll dp[N];
void init() {
memset(dp, 0, sizeof(dp));
dp[0] = 3;
for(int i = 1; i < N; i++)
dp[i] = dp[i-1] * 2 - 1;
}
ll solve(int S, int C, int K) {
if(K == 1 && S != 0) {
if(C <= S - K)
return dp[S - K];
else
return dp[C];
}else if(S == 0) {
if(K == 1)
return (dp[C] - 3);
else
return 0;
}else if(S - K < 0) {
return 0;
}else if(C <= S - K) {
return dp[S - K];
}else {
return dp[S - K + 1];
}
}
int main() {
init();
int S, C, K;
int T;
scanf("%d", &T);
while(T--) {
scanf("%d%d%d", &S, &C, &K);
printf("%lld\n", solve(S,C,K));
}
return 0;
}