HDU 6441——Find Integer (2018CCPC网赛签到题)

  • 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6441
  • 题意:给定你两个整数n和a,找一组这样的整数b和c输出,b和c满足等式a^n+b^n=c^n.
  • 思路:在解这道题之前,需要懂得两个数论的知识。

    • 费马大定理 :当整数n>2时,关于x,y,y的不定方程 x^n+y^n=z^n 没有正整数解。
    • 奇偶数列法则:对于不定方程 x^2+y^2=z^2,当x是满足x=2*n+1(其中n是整数)的奇数时,y = n^2+(n+1)^2-1 ,z = n^2+(n+1)^2;
      当x是满足x=2*n的偶数时,y = n^2-1 ,z = n^2+1

    于是本题便一目了然了:

    • 当n>2或者n=0时(1+1=1恒不成立),输出 -1 -1
    • 当n = 2时,通过奇偶数列法则判断条件即可
  • 代码:
#include "bits/stdc++.h"
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
#define fori(i,l,u) for(int i = l;i < u;i++)
#define forj(j,l,u) for(int j = l;j < u;j++)
#define pb push_back
#define mk make_pair
#define F first
#define S second
typedef long long  ll;
typedef pair<int, int> pi;
typedef pair<string,int> ps;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<pi> vpi;
void init(){
    int t;
    cin>>t;
    while (t--) {
        int n,a;
//        cin>>n>>a;
        scanf("%d%d", &n, &a);
        if (n>2 || n == 0) {
            printf("-1 -1\n");
        }
        else if(n==1){
//            cout<<1<<" "<<a+1<<endl;
            printf("%d %d\n",1,a+1);
        }
        else{
            int b,c;
            if (a%2==0) {
                int k = a/2;
                b = k*k-1;
                c = k*k+1;
            }
            else{
                int k = (a-1)/2;
                b = 2*k*k+2*k;
                c = 2*k*k+2*k+1;
            }
//            cout<<b<<" "<<c<<endl;
            printf("%d %d\n",b, c);
        }
    }
}
int main()
{
    init();
    return 0;
}
  • 遇到的问题 :在hdu提交,如果用cin,cout这类流输入输出会TLE。cin与cout,涉及到缓冲区的问题,比scanf和printf慢。而且endl的含义是换行并清除缓冲区,所以比\n要慢。(虽然我一直以为TLE是复杂度的问题,但是看到知乎大佬如此回答也就似懂非懂。)

猜你喜欢

转载自blog.csdn.net/qq_39763472/article/details/82354252