又是打表找规律

A Central Meridian (ACM) Number N is a positive integer satisfies that given two positive integers A and B, and among A, B and N, we have 
N | ((A^2)*B+1) Then N | (A^2+B) 
Now, here is a number x, you need to tell me if it is ACM number or not. 

Input

The first line there is a number T (0<T<5000), denoting the test case number. 
The following T lines for each line there is a positive number N (0<N<5000) you need to judge.

Output

For each case, output “YES” if the given number is Kitty Number, “NO” if it is not.

Sample Input

2
3
7

Sample Output

YES
NO


        
  

Hint

Hint
X | Y means X is a factor of Y, for example 3 | 9;
X^2 means X multiplies itself, for example 3^2 = 9;
X*Y means X multiplies Y, for example 3*3 = 9.

【思路】

打表:

#include <iostream>
#include <cstring>
using namespace std;
int f[5001];
void init()
//打表找规律的函数
{
    for(int i=1; i<=5000; i++)
    {
        for(int j=1; j<=1000; j++)
        {
            for(int k=1; k<=1000; k++)
            {
                if((j*j*k+1)%i==0&&(j*j+k)%i!=0)
                {
                    f[i]=1;
                    break;
                }
            }
            if(f[i]==1)
                break;
        }
    }
    for(int i=1;i<=5000;i++)
        if(f[i]==0)
        cout<<i<<endl;
}
int main()
{
    init();
}

正式代码:

#include<iostream>
using namespace std;
int t;
int n;
int f[5001];
void init()
{
    f[1]=1;
    f[2]=1;
    f[3]=1;
    f[4]=1;
    f[5]=1;
    f[6]=1;
    f[8]=1;
    f[10]=1;
    f[12]=1;
    f[15]=1;
    f[16]=1;
    f[20]=1;
    f[24]=1;
    f[30]=1;
    f[40]=1;
    f[48]=1;
    f[60]=1;
    f[80]=1;
    f[120]=1;
    f[240]=1;
}
int main()
{
    init();
    ios::sync_with_stdio(false);
    cin>>t;
    while(t--)
    {
        cin>>n;
        if(f[n]==1)
            cout<<"YES"<<endl;
        else
            cout<<"NO"<<endl;
    }
    return 0;
}

 

<think>嗯,用户问的是蓝桥杯打表骗分,这应该是在编程竞赛中的一种技巧。首先,我需要明确什么是“打表骗分”。根据之前的了解,这可能指的是在比赛中通过预先计算某些测试用例的结果,然后在程序中直接输出这些结果,而不是通过正确的算法来解决问题。这种方法通常用于时间紧迫或题目难度较高的情况下,用来获取部分分数。 接下来,我需要确定蓝桥杯的具体情况。蓝桥杯是中国的一个编程竞赛,分为不同的难度级别,题目通常包括填空题和编程题。打表骗分可能更常见于填空题,因为填空题只需要答案,不需要代码。但用户提到的是“打表骗分”,所以可能是指编程题中通过部分正确输出来获取分数的情况。 然后,我需要思考打表的具体步骤。通常,打表需要先出题目中的规律或者可能的输入范围。比如,如果题目输入的n比较小,可以手动计算所有可能的n值对应的结果,然后在代码中直接输出这些结果。但需要注意,蓝桥杯的测试用例可能有多个,所以需要覆盖所有可能的输入。 但是,这种方法的风险在于,如果测试用例的输入范围很大,或者结果无法通过简单规律得出,打表可能不可行。此外,编程题通常需要提交源代码,如果代码中明显是硬编码的结果,可能会被系统检测出来,导致无效。不过在蓝桥杯中,可能部分题目允许这种方式,尤其是当时间不够时,选手可能会尝试用这种方法获取部分分数。 接下来,我需要考虑如何组织回答的结构。首先解释什么是打表骗分,然后适用场景,具体步骤,实例说明,优缺点,最后注意事项。这样用户能够逐步理解。 还需要注意用户可能的疑问,比如这种方法是否合法,是否会被扣分。根据竞赛规则,如果题目没有明确禁止,通常这种方法是允许的,但属于取巧手段,可能只能通过部分测试用例,得到部分分数,而不是满分。所以称为“骗分”。 然后,我需要一个合适的例子来说明。例如,求第n个斐波那契数,当n很小的时候,可以手动计算并输出。但若n很大,这种方法就不行了。或者比如规律题,通过小数据规律公式,然后编码。 另外,要注意LaTeX格式的使用,用户提到数学表达式要用$...$,独立公式用$$...$$,所以回答中的数学部分需要正确应用格式。例如,在说明斐波那契数列时,可能需要用$F(n)$这样的表示。 最后,确保回答真实可靠,不误导用户。需要指出打表骗分的局限性,以及正确掌握算法的重要性,不能依赖这种方法,但在紧急情况下可以作为备用策略。</think>### 蓝桥杯“打表骗分”技巧详解 #### 1. **什么是“打表骗分”?** - **定义**:在编程竞赛中,当遇到难以直接推导或计算的题目时,通过预先计算部分输入对应的输出结果,并硬编码到程序中,以覆盖部分测试用例的得分。 - **目标**:在时间紧张或算法能力不足时,通过观察规律或暴力计算,快速获取部分分数。 --- #### 2. **适用场景** - **输入范围小**:例如题目中 $n \leq 20$,可直接枚举所有情况。 - **输出存在规律**:例如斐波那契数列、排列组合数等。 - **填空题**(蓝桥杯特色题型):仅需提交结果,无需代码,可直接暴力计算后填写答案。 --- #### 3. **具体操作步骤** **步骤1:暴力计算或规律** - 写一个暴力程序(例如枚举所有可能输入),运行后记录结果。 - 或通过数学推导,到输出与输入的函数关系(例如 $f(n) = n^2 + 1$)。 **步骤2:硬编码结果** - 将计算结果直接写入代码,例如: ```python ans = {1:3, 2:5, 3:7, ...} # 预存结果 n = int(input()) print(ans.get(n, -1)) # 直接查表输出 ``` **步骤3:覆盖边界条件** - 确保特殊值(如 $n=0$ 或最大值)被正确处理,避免因未覆盖用例而丢分。 --- #### 4. **实例分析** **题目**:计算第 $n$ 个满足某种性质的数(例如“既是质数又是回文数”)。 **打表过程**: 1. 写暴力代码枚举 $n=1$ 到 $n=100$ 的结果。 2. 发现规律:当 $n \leq 10$ 时,结果为 $[2, 3, 5, 7, 11, 101, 131, 151, 181, 191]$。 3. 直接硬编码输出: ```python table = [2,3,5,7,11,101,131,151,181,191] n = int(input()) print(table[n-1] if n<=10 else -1) ``` --- #### 5. **优缺点分析** - **优点**: - 快速得分,尤其适合时间紧迫的竞赛场景。 - 对复杂问题可“部分得分”,避免零分。 - **缺点**: - 仅适用于输入范围小或规律明显的题目。 - 代码可读性差,且无法通过大规模测试用例。 --- #### 6. **注意事项** - **合法性**:蓝桥杯允许此方法,但需确保代码能通过编译。 - **风险控制**:优先保证正确性,避免因打表错误导致丢分。 - **结合正解**:在时间允许时,尽量用标准算法验证结果。 --- #### 7. **总结** 打表骗分是竞赛中的一种实用技巧,**核心思想是“用空间换时间”**。但它本质是应急策略,需与扎实的算法能力结合使用。建议平时多练习暴力枚举和数学推导能力,以快速识别打表机会。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值