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;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值