zoukankan      html  css  js  c++  java
  • Contest #0 A题(暴力)

    题目描述
    小象同学在初等教育时期遇到了一个复杂的数学题,题目是这样的:
    给定自然数
    nn
    n,确定关于
    x,y,zx, y, z
    x,y,z 的不定方程
    x−n+y−z=0displaystyle sqrt{x - sqrt{n}} + sqrt{y} - sqrt{z} =0的所有自然数解。
    当时的小象同学并不会做这道题。多年后,经过高等教育的洗礼,小象同学发现这道题其实很简单。小象同学认为你一定也会做这道题,所以把这道题留给了你。为了便于输出,你不需要输出每一组解
    (x,y,z)(x, y, z)
    (x,y,z),你只需要给出解的数量和所有解的
    xyzx y z
    xyz 之和对
    (109+7)(10^9+7)
    (10
    9
    +7) 取模的值即可。注意,解的数量不对
    (109+7)(10^9+7)(109+7) 取模。
    输入描述
    输入包含多组测试数据。输入的第一行包含一个正整数
    TT
    T (
    1≤T≤1041 leq T leq10^4
    1≤T≤10
    4
    ),表示测试数据的组数。接下来依次描述每组测试数据,对于每组测试数据:
    仅一行,包含一个非负整数
    nn
    n (
    0≤n≤2×1090 leq n leq 2 imes 10^9
    0≤n≤2×10
    9
    ),含义如题面所示。
    输出描述
    对于每组数据,输出一行。若方程有无穷多组自然数解,则在这一行输出
    “infty” ext{``infty''}
    “infty”(不含引号),否则在这一行输出两个整数,其中第一个整数表示方程的解数,第二个整数表示所有解的
    xyzx y z
    xyz 之和对
    (109+7)(10^9+7)
    (10
    9
    +7) 取模的值,这两个整数之间用恰好一个空格隔开,行末不要有多余的空格。
    样例输入 1
    3
    6
    12
    24
    样例输出 1
    0 0
    1 12
    2 72
    提示

    n=12n = 12
    n=12 时,方程唯一的解为
    x=4x = 4
    x=4,
    y=1y = 1
    y=1,
    z=3z = 3
    z=3。

    n=24n = 24
    n=24 时,方程的两组解为
    x=5x = 5
    x=5,
    y=2y = 2
    y=2,
    z=3z = 3
    z=3 和
    x=7x = 7
    x=7,
    y=1y = 1
    y=1,
    z=6z = 6
    z=6。

    将题目公式化简,得到 x=z+y;n=4zy;

    两种情况需要特判:

    1.是n可以开方的时候,x2=n,z=y,z和y可以取任意的自然数,属于方程有无穷多组自然数解的情况.

    2.因为z和y是自然数,如果有解,n=4zy,那么n肯定是可以被4整除的;不能被4整除时,输出0 0;

    分割线:--------------------------------------------------------------------------------------------------------------------------

    吐槽:这道题居然卡long long,n用ll会TLE,这我还是第一次遇到.有听人说过ll运算慢,但是以前还没遇到,这次总算见识到了.呜呜呜呜,我好菜啊.
    只会写a题,让各位见笑了.
    #include <bits/stdc++.h>
    using namespace std;
    const int N=1e9+7;
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--){
            int n;
            int ans=0;
            int cnt=0;
            scanf("%d",&n);
            int p=sqrt(n);
            if(p*p==n){
                puts("infty");continue;
            }
            if(n%4!=0){
                puts("0 0");continue;
            }
            n/=4;
            for(int y=1;ll(y*y)<=n;y++){
                if(n%y==0){
                    cnt++,ans=(ans+((n/y+y)*ll(n))%N)%N;
                }
            }
            printf("%d %d
    ",cnt,ans);
        }
        return 0;
    }
    
  • 相关阅读:
    数组,一维,二维,多维
    类函数:string、math
    while和for的内嵌
    循环语言(for)
    选择语言之switch case
    程序语言
    语言、数据和运算符
    原理之一,进制转换
    HTML第一部分
    结构体共用变量 递归
  • 原文地址:https://www.cnblogs.com/-yjun/p/10637539.html
Copyright © 2011-2022 走看看