zhangjinxuan 发表于 2023-1-30 13:57:38

【C++板块提升计划】梦想护卫舰 第18关 解密(2)【原创】【答题有奖】

本帖最后由 zhangjinxuan 于 2023-2-3 11:29 编辑


上一关:旋转与回文


梦想护卫舰 第18关 解密

为了救出 zhangjinxuan,你们只好先放下宝箱,向远处的山奔去

奇怪的是,这座山居然用一道高高的围墙围着,似乎里面有什么神秘的东西

突然,你们在山上发现了……UFO??!(歪星仁?!)

管不了这么多了,进去救人要紧

这是,你们面前的围墙突然变成了 T 道密码门,我们又要来解密了……(歪星仁领地已成功确认)

每一道密码门会给定正整数字 n, 请问 a^2 + n = b^2 一共有多少非负整数解(含0)?

解法数量就是密码

输入格式

T
N1 N2 ... NT

输出格式
一行 T 个数字,表示每个不定方程的解法总数

输入样例1
5
2020 2021 2022 2023 2024


输出样例1
2 2 0 3 4


输入样例2
10
10007 114514 993264353 65536 65535 376542 376544 9000000 3000000 1000000

输出样例2
1 0 8 8 8 0 12 53 35 18

注意,本样例属于 Extra Test 其中之一,这个超时了没关系~

数据范围
对于 100% 的数据,保证 1 <= n, T <= 1000
你别以为这是水题,这个可是有 Extra Test 的哦!
Extra Test 介绍:
当你 100 分的时候,就会开始测试Extra Test
一般情况下,Extra Test 如果没有通过,会扣三分
通过了也不会给你加分
Extra Test 的数据范围与 正常Test 100%数据是一样的

不过这道题不一样,没通过扣5分,数据也不一样:(就是玩~)
Extra Test有三个,这三个Extra Test保证 1 <= (sigma sqrt(n)) * t <= 1e7, 1 <= n <= 1e9

C/C++时间限制:1000ms
C/C++空间限制:256mb
其他语言时间限制:3000ms
其他语言空间限制:1024mb

注意:本题个人原创,转载请注明出处

static/image/hrline/1.gif

答案与解析
**** Hidden Message *****


最佳战士排行榜

|第一名|第二名|第三名
名字|tommyyu|sfpxx|元豪
链接|戳我|戳我|戳我
语言|Python|Scratch|Python
效率|546ms|无|205ms
代码得分|100|60|60
综合得分|100|70|70
奖励|5鱼币5荣誉+“最佳答案(另一贴)”|3鱼币3荣誉+"最佳答案"(本贴)|2鱼币2荣誉

/*综合评分会参照运行时间(代码效率),代码长度,代码可读性,解题思路,代码得分等来进行评分*/

答题规则
1. 不能抄题解,否则无奖励,可能还会扣分;
2. 爆零的代码,视为普通回帖,不会奖励;
3. 语言任意。
4. 当您遇到问题时,您可以回贴提问,我会为您解答

奖励规则
1. 奖励3天后统一发,3天内发布的题解才有效;
2. 提供完整题解,但没有上排行榜,奖励1鱼币+1荣誉;
3. 高于1鱼币1荣誉的奖励,仅给排行榜上的鱼油(因为经济原因,请谅解);
4. 因为额度原因,部分鱼油可能下一天才能奖励。


**** Hidden Message *****

static/image/hrline/1.gif

下一关:铺地毯

创作不易,如果你喜欢,别忘了评分、顶{:10_281:}


本关满意度调查

tommyyu 发表于 2023-1-30 18:26:53

zhangjinxuan 发表于 2023-1-30 18:20
https://fishc.com.cn/forum.php?mod=redirect&goto=findpost&ptid=223880&pid=6130703

改完了def prime():
    global primes
    def is_prime(n):
      if n<2: return False
      return all(n%i for i in range(2, int(n**0.5+1)))
    primes =
def count(yinshu, exp_2):
    # print(yinshu, exp_2)
    if exp_2 == 0: return yinshu // 2 + yinshu % 2
    if exp_2 == 1: return 0
    s = (yinshu // 2) * (exp_2-1)
    s += (yinshu % 2) * (exp_2 // 2)
    return s

def count_yinshu(n):
    #print(n, end = ' ')
    i = 1
    yinshu = dict()
    try:
      while n != 1:
            if n < primes and n != 1: return 2
            while n % primes == 0:
                # print(n)
                yinshu] = yinshu.get(primes, 0) + 1
                n = n // primes
            i += 1
    except:
      yinshu = 1
    s = 1
    for i in yinshu:
      s *= (yinshu+1)
    return s

def count_2_exp(n):
    exp_2 = 0
    while not n % 2:
      n //= 2
      exp_2 += 1
    return exp_2, n

def count_n(n):
    exp_2, new_n = count_2_exp(n)
    return count(count_yinshu(new_n), exp_2)

input()
n = list(map(int, input().split()))
#import time
#start = time.time()
prime()
for i in n:
    print(count_n(i), end = ' ')
#end = time.time()
#print('\n', start - end, sep = '')

sfqxx 发表于 2023-1-30 23:23:13

本帖最后由 sfqxx 于 2023-1-31 17:18 编辑

zhangjinxuan 发表于 2023-1-30 15:23
嘿嘿嘿,还是数学题难

直接按照题解思路做不就得了吗?
肝了100分钟,修复了30分钟bug
可算做出来了
因为Scratch难做,所以运行正确可以给我最佳答案吗?(因为tommyu已经够多了,反正这次是第一)
嘿嘿,顺便赚一丢丢鱼币(附件购买){:10_279:}
如果超时间没关系吧(偶数需要30秒,不过奇数可以快点)(这是最新版,之前的会超时)
下载直接改扩展名就好了(sb3){:10_256:}

元豪 发表于 2023-1-31 14:43:39

{:10_250:}不知道能不能过
T = int(input())
N = input().split()
p =
for i in range(T):
    for a in range(int(N)):
      for b in range(int(N)):
            if pow(a, 2) + int(N) == pow(b, 2):
                p += 1
for i in range(T):
    print(p, end=' ')

菜鸟的答案{:10_250:}

sfqxx 发表于 2023-1-30 14:52:55

语言任意?
是时候用Scratch了{:10_279:}

zhangjinxuan 发表于 2023-1-30 15:07:35

sfqxx 发表于 2023-1-30 14:52
语言任意?
是时候用Scratch了

啊,啊,啊{:10_277:}

zhangjinxuan 发表于 2023-1-30 15:08:11

sfqxx 发表于 2023-1-30 14:52
语言任意?
是时候用Scratch了

你真能钻bug{:10_306:}
但我好奇你怎么做……

zhangjinxuan 发表于 2023-1-30 15:23:59

sfqxx 发表于 2023-1-30 14:52
语言任意?
是时候用Scratch了

嘿嘿嘿,还是数学题难{:10_256:}

sfqxx 发表于 2023-1-30 15:37:51

zhangjinxuan 发表于 2023-1-30 15:23
嘿嘿嘿,还是数学题难

然我看看题解
磨刀不误砍柴工{:10_256:}

zhangjinxuan 发表于 2023-1-30 15:43:29

sfqxx 发表于 2023-1-30 15:37
然我看看题解
磨刀不误砍柴工

{:10_256:}

tommyyu 发表于 2023-1-30 15:48:01

{:10_279:}

tommyyu 发表于 2023-1-30 16:38:07

输入样例2为什么连Extra Test的数据范围都超了?

元豪 发表于 2023-1-30 16:42:37

有没有时间限制啊{:10_245:}{:10_245:}

我写的代码运行差点以为假死了{:10_250:}{:10_250:}

zhangjinxuan 发表于 2023-1-30 16:53:24

元豪 发表于 2023-1-30 16:42
有没有时间限制啊

我写的代码运行差点以为假死了

1s

zhangjinxuan 发表于 2023-1-30 16:54:24

本帖最后由 zhangjinxuan 于 2023-1-30 16:57 编辑

tommyyu 发表于 2023-1-30 16:38
输入样例2为什么连Extra Test的数据范围都超了?

我改一改:
1 <= (sigma sqrt(n)) * t <= 1e7

tommyyu 发表于 2023-1-30 16:58:21

本帖最后由 tommyyu 于 2023-1-30 17:06 编辑

primes =
# 上面懒得写成线性筛了,如果有要求不能打表就改成线性筛,1~1000以内的素数
def count(yinshu, exp_2):
    if exp_2 == 0: return yinshu // 2 + yinshu % 2
    if exp_2 == 1: return 0
    s = (yinshu // 2) * (exp_2-1)
    s += (yinshu % 2) * (exp_2 // 2)
    return s

def count_yinshu(n):
    try:
      #print(n, end = ' ')
      i = 1
      yinshu = dict()
      while n != 1:
            #print(n)
            while n % primes == 0:
                yinshu] = yinshu.get(primes, 0) + 1
                n = n // primes
            i += 1
      s = 1
      for i in yinshu:
            s *= (yinshu+1)
      #print(s)
      return s
    except:
      return 2
def count_2_exp(n):
    exp_2 = 0
    while not n % 2:
      n //= 2
      exp_2 += 1
    return exp_2, n

def count_n(n):
    exp_2, new_n = count_2_exp(n)
    return count(count_yinshu(new_n), exp_2)

input()
n = list(map(int, input().split()))
#import time
#start = time.time()
for i in n:
    print(count_n(i), end = ' ')
#end = time.time()
#print('\n', end - start, sep = '')

zhangjinxuan 发表于 2023-1-30 17:05:17

tommyyu 发表于 2023-1-30 16:58


建议写线性筛,因为,1 <= n <= 1e9{:10_282:}

这样一来,就得需要4万以内的质数

zhangjinxuan 发表于 2023-1-30 17:07:25

tommyyu 发表于 2023-1-30 16:58


1 <= (sigma sqrt(n)) * t <= 1e7, 1 <= n <= 1e9
再加一个条件吧,免得有些人被 long long 坑了{:10_306:}
(因为这样 n 可能等于 1e14,t = 1……)

tommyyu 发表于 2023-1-30 17:24:00

zhangjinxuan 发表于 2023-1-30 17:07
再加一个条件吧,免得有些人被 long long 坑了
(因为这样 n 可能等于 1e14,t = 1……)

改好了{:10_256:}def prime():
    global primes
    def is_prime(n):
      if n<2: return False
      return all(n%i for i in range(2, int(n**0.5+1)))
    primes =
def count(yinshu, exp_2):
    if exp_2 == 0: return yinshu // 2 + yinshu % 2
    if exp_2 == 1: return 0
    s = (yinshu // 2) * (exp_2-1)
    s += (yinshu % 2) * (exp_2 // 2)
    return s

def count_yinshu(n):
    try:
      #print(n, end = ' ')
      i = 1
      yinshu = dict()
      while n != 1:
            if n < primes and n != 1: return 2
            while n % primes == 0:
                #print(n)
                yinshu] = yinshu.get(primes, 0) + 1
                n = n // primes
            i += 1
      s = 1
      for i in yinshu:
            s *= (yinshu+1)
      #print(s)
      return s
    except:
      return 2
def count_2_exp(n):
    exp_2 = 0
    while not n % 2:
      n //= 2
      exp_2 += 1
    return exp_2, n

def count_n(n):
    exp_2, new_n = count_2_exp(n)
    return count(count_yinshu(new_n), exp_2)

input()
n = list(map(int, input().split()))
#import time
#start = time.time()
#prime()
for i in n:
    print(count_n(i), end = ' ')
#end = time.time()
#print('\n', start - end, sep = '')

zhangjinxuan 发表于 2023-1-30 17:39:58

tommyyu 发表于 2023-1-30 17:24
改好了

我都开 long long 了,结果还是不一样{:10_291:}
#include <bits/stdc++.h>
using namespace std;

int t;
long long n;

long long solve(long long n) {
    if (n % 2 == 0) {
      long long res = 0;
      for (long long i = 2; 1LL * i * i <= n; i += 2) {
            if (n % i == 0 && n / i % 2 == 0) ++res;
      }
      return res;
    } else {
      long long res = 0;
      for (long long i = 1; 1LL * i * i <= n; i += 2) {
            if (n % i == 0) ++res;
            }
      return res;
    }
}

int main() {
    scanf("%d", &t);
    while (t--) {
      scanf("%lld", &n);
      printf("%lld ", solve(n));
    }
}

tommyyu 发表于 2023-1-30 17:41:56

zhangjinxuan 发表于 2023-1-30 17:39
我都开 long long 了,结果还是不一样

{:10_282:}

zhangjinxuan 发表于 2023-1-30 17:42:08

本帖最后由 zhangjinxuan 于 2023-1-30 17:43 编辑

tommyyu 发表于 2023-1-30 17:24
改好了

这组数据:
1
993264353
我都怀疑 993264353 不是质数了{:10_284:}
本来就不是

zhangjinxuan 发表于 2023-1-30 17:43:13

zhangjinxuan 发表于 2023-1-30 17:42
这组数据:

我都怀疑 993264353 不是质数了

好像本来就不是
页: [1] 2 3 4
查看完整版本: 【C++板块提升计划】梦想护卫舰 第18关 解密(2)【原创】【答题有奖】