CodeChef SIGNWAVE (打表找规律)

题意:

给你两个函数
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;
} 

你可能感兴趣的:(CodeChef,signwave)