zoukankan      html  css  js  c++  java
  • 费尔马大定理搞笑版 (湖南省第九届大学生计算机程序设计大赛)



    1337: 费尔马大定理搞笑版

    Time Limit: 1 Sec  Memory Limit: 128 MB
    Submit: 402  Solved: 193
    [Submit][Status][Web Board]

    Description

    费马大定理:当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

    HINT

    事实上是一道水题。開始也想了非常久没什么思路,感觉就那么做会超时,没有明确题目的深一层的含义, 事实上给我们的数据范围就是一个突破口;
    尽管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.
    有了上面的分析,这道题就非常easy啦。直接暴力,两个循环就搞定了;
    #include <cstdio>
    #include <cstring>
    using namespace std;
    int main()
    {
        int x,y,a,b,c,count,k=0;
        while(scanf("%d%d",&x,&y)!=EOF)
        {
            count=0;
             for(a=x;a<=1000&&a<=y;a++)
                for(b=x;b<=1000&&b<=y;b++)
             {
                 int s=a*a*a+b*b*b;
                 if(s%10!=3) continue;
                  c=s/10;
                  if(c>=x&&c<=y) count++;
             }
              printf("Case %d: %d
    ", ++k, count);
        }
        return 0;
    }
    
    别人0ms的代码。
    #include<stdio.h>
     
     
    int main()
    {
        //freopen("a.txt","r",stdin);
        long long x,y,i,j,t;
        int a=0;
        while(scanf("%lld%lld",&x,&y)!=EOF)
        {
            t=x*x*x;
            a++;
            y=y*10+3;
            int cnt=0;
            for(i=x,j=1;t+i*i*i<=y;i++,j++);
            long long ii=i,jj=j;
            //printf("%lld %lld
    ",i,j);
            for(i=x;i<=ii;i++)
            {
                int k=(13-i*i*i%10)%10;
                if(k!=0 && k!=1 && k!=4 && k!=5 && k!=6 && k!=9) k=10-k;
                for(j=x-x%10+k;j<ii;j+=10)
                {
                    if(j<x) j+=10;
                    if(j*j*j+i*i*i<=y)   cnt++; //printf("%lld %lld
    ",i,j);
                }
            }
            printf("Case %d: %d
    ",a,cnt);
        }
        return 0;
    }


    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    什么是DMI,SMBIOS,符合SMBIOS规范的计算机的系统信息获取方法
    Android init.rc执行顺序
    JVM-类的四种载入方式
    Intellij-创建Maven项目速度慢
    Intellij-工程目录下隐藏不想显示的文件和文件夹
    JVM-类加载机制(Java类的生命周期)
    Git-远程仓库的使用
    JavaSE-反射-获取类或者对象的四种方法
    工厂模式(Factory Pattern)
    Redis-配置认证密码
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4776166.html
Copyright © 2011-2022 走看看