BestCoder ztr loves math

只能说没别人聪明,能推出公式,只能把符合的数打印出来,找规律尴尬

比赛的时候没考虑到1和4,还有一个小细节,导致没有AC,现在AC了,936MS。

细节在下面注释已经写了。

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
    //可以先把1-100符合的样子打印出来,发现每20个是一个周期,所以打了两张表,a表为十位数是偶数的,b表为十位数是奇数的
    int a[10]={1,1,0,1,1,1,0,1,1,1};
    int b[10]={0,1,1,1,0,1,1,1,0,1};
    int t;
    cin>>t;
    while(t--)
    {
        long long int n;
        cin>>n;
        if(n==1||n==4) {cout<<"False"<<endl;continue;}//如果是1和4的话那么y只能为0,而0不是一个正整数,所以不符合。
        int x=n%100/10%2;//一开始用的是x=n/10%10%2 但是这么做超时,改成这样时间936MS,好紧啊,因为这个数可能很大先求余的话求出来的数就只有两位,而先除的话那么求出来的数可能还是很长,
                         //所以对时间可能有一定影响
        int y=n%10;
        if((!x&&a[y])||(x&&b[y])){
            cout<<"True"<<endl;
        }
        else{
            cout<<"False"<<endl;
        }
    }
    return 0;
}

补充:列出从1-12的平方数,1,4,9,16,25,36,49,64,81,100,121,144

运用数学归纳法:

可以看出相两个数之差为:3,5,7,9,11,13,15,17,19,21,23

每隔一个数之差为:8,12,16,20,24,28,32,36,40,44

那么也就是所从3开始到无穷大,只要是奇数,必有两个相邻的数的平方之差为这个奇数,如果是偶数,那么从8开始,同理可得必有两数之差可为这个偶数,

那么得出结论:(n>=3&&n%2==1)||(n>=8&&n%4==0)符合这个条件即是True,否则为False

提示:相同代码c++超时,换成c218MS,以后尽量写c

#include<stdio.h>
int main()
{
    int t;
    scanf("%d",&t);
    int n;
    while(t--)
    {
        scanf("%d",&n);
        if((n>=3&&n%2)) printf("True\n");
        else if((n>=8&&!(n%4))) printf("True\n");
        else printf("False\n");
    }
    return 0;
}





你可能感兴趣的:(BestCoder ztr loves math)