小编Mer*_*ado的帖子

以O(N ^ 2)速度计算成对总和mod 10 ^ 9 + 7的乘积的替代方法

给定大小为N的整数数组A,我想计算

这是过去大学间编程竞赛中的一个问题.我们必须写这将解决了这个问题的5实例程序,与ñ  ≤200,000,每一个  ≤20万辆,20秒运行时间限制内.显然,O(N 2)解决方案将超过时限.根据社论,预期的解决方案涉及使用快速傅里叶变换的多项式乘法.我正在寻找可以比没有FFT(也不是NTT)的朴素O(N 2)算法更快地解决这个问题的替代算法.这个问题有没有简单而优雅的解决方案?

已知事实:

mod可以在产品内"分布",因为(x*y)%m =((x%m)*(y%m))%m

更新:这是比赛期间的输入/输出测试用例文件:如果它在20秒内通过,它将被接受.输入:https ://www.dropbox.com/s/nw81hts9rniter5/algol.in?dl =0输出:https://www.dropbox.com/s/kpa7wit35xr4xm4/algol.out? dl =0

algorithm math

16
推荐指数
1
解决办法
715
查看次数

为什么sys_read系统在检测到新行时调用结束?

我是汇编的初学者(使用nasm).我正在通过大学课程学习集会.

我试图了解sys_read linux系统调用时的行为.具体来说,sys_read在读取新行或换行符时停止.根据我所教的,这是事实.这篇在线教程文章也肯定了事实/主张.

当sys_read检测到换行时,控制返回到程序,用户输入位于您在ECX中传递的内存地址.

我检查了linux程序员的sys_read调用手册(通过"man 2 read").它没有提到它应该的行为,对吧?

read()尝试从buf开始读取从文件描述符fd到缓冲区的字节数.

在支持搜索的文件上,读取操作从文件偏移开始,文件偏移量增加读取的字节数.如果文件偏移量等于或超过文件末尾,则不读取任何字节,read()返回零.

如果count为零,则read()可以检测下面描述的错误.在没有任何错误的情况下,或者read()没有检查错误时,计数为0的read()返回零并且没有其他影响.

如果count大于SSIZE_MAX,则结果未指定.

所以我的问题是,为什么会发生这种行为?Linux内核中的规范是否应该发生这种情况还是其他内容的结果?

linux assembly nasm system-calls tty

11
推荐指数
2
解决办法
1160
查看次数

没有引用和赋值的递归

问题是在python(或类似的)中给出了一个递归函数,是否可以重写它以便它不引用自身。我做了一个适用于该问题的简单示例。当然,不允许将其设为非递归函数。它仍然必须执行相同的递归过程。

def fact(n):
  if n == 0:
    return 1
  return n * fact(n - 1)
Run Code Online (Sandbox Code Playgroud)

它也相当于简写。

fact = lambda n: 1 if n == 0 else n * fact(n - 1)
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我不应该fact在函数定义内部调用。

编辑:

附加约束:分配不一定是解决方案工作所必需的。

没有附加约束的一种解决方案(来自评论)是创建两个函数ab它们交替调用并有效地执行阶乘。这是不允许的,因为它要求您在两个变量中分配两个函数。

一个不需要赋值的函数的简单例子是

f = lambda x: x + 1
Run Code Online (Sandbox Code Playgroud)

为了让它在 arugment 上执行55,我可以只写

(lambda x: x + 1)(55)
Run Code Online (Sandbox Code Playgroud)

所以分配是没有必要的。

这有什么提示吗?还是我被一个不可能的问题欺骗了?

python recursion

6
推荐指数
1
解决办法
3681
查看次数

多处理。进程和异步循环通信

import asyncio
from multiprocessing import Queue, Process
import time

task_queue = Queue()

# This is simulating the task
async def do_task(task_number):
  for progress in range(task_number):
    print(f'{progress}/{task_number} doing')
    await asyncio.sleep(10)

# This is the loop that accepts and runs tasks
async def accept_tasks():
  event_loop = asyncio.get_event_loop()
  while True:
    task_number = task_queue.get() <-- this blocks event loop from running do_task()
    event_loop.create_task(do_task(task_number))

# This is the starting point of the process,
# the event loop runs here
def worker():
  event_loop = asyncio.get_event_loop()
  event_loop.run_until_complete(accept_tasks()) …
Run Code Online (Sandbox Code Playgroud)

python multiprocessing python-asyncio

1
推荐指数
1
解决办法
3321
查看次数