CSU 1337 搞笑版费马大定理【优化枚举】

本文介绍了一种基于费马大定理的趣味编程题目,通过限定条件和巧妙枚举的方法解决了a³+b³=c³形式方程在特定范围内的整数解数目问题,并提供了一个高效的算法实现。

费马大定理:当n>2时,不定方程an+bn=cn没有正整数解。比如a3+b3=c3没有正整数解。为了活跃气氛,我们不妨来个搞笑版:把方程改成a3+b3=c3,这样就有解了,比如a=4, b=9, c=79时43+93=793。

输入两个整数x, y, 求满足x<=a,b,c<=y的整数解的个数。

 

Input

输入最多包含10组数据。每组数据包含两个整数x, y(1<=x,y<=108)。

 

Output

对于每组数据,输出解的个数。

 

Sample Input

1 10
1 20
123 456789

Sample Output

Case 1: 0
Case 2: 2
Case 3: 16
【分析】:数据范围就是一个突破口。
虽然x和y的范围都是10^8,但是如果a 是大于1000的话,那么a^3就会大于10^9,这样等号的右边只有一个10 * c + 3,
这个最大只能达到10^9数量级,所以,不管输入的x跟y是多少,我们只要取其中的在1到1000的区间就可以了,
枚举a和b,那么c就可以得到,然后判断c的范围是不是在x到y之间,这样时间复杂度就降到了10^6.
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
#define INF 999999
using namespace std;

int main()
{
    int x,y;
    int cas=1;
    int cnt;
    while(~scanf("%d%d",&x,&y))
    {
        cnt=0;
        for(int i=x;i<1005;i++)
        {
            for(int j=x;j<1005;j++)
            {
                if((i*i*i+j*j*j)%10==3&&(i*i*i+j*j*j)/10>=x&&(i*i*i+j*j*j)/10<=y)
                    cnt++;
            }
        }
        printf("Case %d: %d\n",cas++,cnt);
    }
    return 0;
}
View Code

 

转载于:https://www.cnblogs.com/Roni-i/p/7384989.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值