hud 6441+费马大定理+奇偶数列法

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6441

题目大意:多样例测试,输入n, a;求 a^n+b^n=c^n 的b, c的值

思考:
根据费马大定理n>2该方程无解
n=0也无解, n=1输出两个随便满足的值就行了(a+b=c)。
n=2用奇偶数列法,证明链接:https://blog.csdn.net/Dilly__dally/article/details/82081922

        //a为奇数
        //a=2n+1; b=n^2+(n+1)^2-1; c=n^2+(n+1)^2
        if(a%2==1)
        {
            int n=(a-1)/2;
            b=n*n+(n+1)*(n+1)-1;
            c=n*n+(n+1)*(n+1);
            printf("%lld %lld\n",b, c);
        }

        //a为偶数
        //a=2n; b=n^2-1; c=n^2+1 
        else
        {
            int n=a/2;
            b=n*n-1;
            c=n*n+1;
            printf("%lld %lld\n",b, c);
        }

队友提高一种新方法:找规律

//a为奇数
//b=int(a^a/2); c=b+1

//a为偶数
//while(a/2); 直到a==奇数||a=4

奇偶数列法+AC代码

#include<bits/stdc++.h>
using namespace std;
#define LL long long

//费马大定理a^n+b^n=c^n, n>2||n==0无解 

//n=2 
//a^2+b^2=c^2
//输入a, 求b, c;
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        LL a, b, c, m;

        scanf("%lld%lld",&m,&a);

        if(m>2||m==0)
        {
            printf("-1 -1\n");
        }
        else if(m==1)
        {
            printf("%lld %lld\n",a, a*2);
        }
        //a为奇数
        //a=2n+1; b=n^2+(n+1)^2-1; c=n^2+(n+1)^2
        else if(a%2==1)
        {
            int n=(a-1)/2;
            b=n*n+(n+1)*(n+1)-1;
            c=n*n+(n+1)*(n+1);
            printf("%lld %lld\n",b, c);
        }
        //a为偶数
        //a=2n; b=n^2-1; c=n^2+1 
        else
        {
            int n=a/2;
            b=n*n-1;
            c=n*n+1;
            printf("%lld %lld\n",b, c);
        }
    }

    return 0;
}

规律+AC代码

#include<bits/stdc++.h>
using namespace std;
#define LL long long

//费马大定理a^n+b^n=c^n, n>2||n==0无解

//n=2
//a^2+b^2=c^2
//输入a, 求b, c;
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        LL a, b, c, m;

        scanf("%lld%lld",&m,&a);

        if(m>2||m==0)
        {
            printf("-1 -1\n");
        }
        else if(m==1)
        {
            printf("%lld %lld\n",a, a*2);
        }
        //a为奇数
        //b=int(a^a/2); b+1
        else if(a%2==1)
        {
            b=(a*a/2);
            c=b+1;
            printf("%lld %lld\n",b, c);
        }
        //a为偶数
        //while(a/2); 直到a==奇数||a=4

        else
        {
            if(a==0)
            {
                printf("0 0\n");
                continue;
            }
            else if(a==2)
            {
                printf("0 2\n");
                continue;
            }

            LL n=1;
            while(1)
            {
                a/=2;
                n*=2;

                if(a==4||a%2==1)
                break;
            }
            if(a==4)
            {
                b=3*n;
                c=5*n;
                printf("%lld %lld\n",b, c);
            }
            else
            {
                b=(a*a/2);
                c=(b+1);
                printf("%lld %lld\n",b*n, c*n);
            }
        }
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_21433411/article/details/82319523
HUD
今日推荐