LitCTF2023

小小小

Background

源码星球上有一种有趣的游戏「小,小小小」。

Description

给你 nn 张卡片,第 ii 张卡片上写着 aia_i

定义一个包含 nn 张卡片的卡片组分值为:

i=1naiai+1\sum_{i=1}^{n}\lvert {a_i - a_{i + 1}}\rvert

其中 an+1=a1a_{n+1} = a_1

卡片的顺序显然会影响其分值,所以你需要将其以某种方式排列以得到最小的分值。

因为游戏要求,你还需要对卡片的每个前缀计算将其排列后能得到的最小分值。

Format

Input

第一行一个正整数 nn,表示卡片数。

第二行 nn 个整数,第 ii 个表示 aia_i

Output

nn 行每行一个整数,即你能从卡片 [1,i][1, i] 中得到的最小分值。

Samples

in1

5
5 3 4 4 7

out1

0
4
4
4
8

Limitation

对于 100%100 \% 的数据,1n106,0ai<2311 \le n \le 10^6, 0 \le a_i \lt 2^{31}


Prime

题目背景

打比赛怎么能没有质数呢?

题目描述

给你一个正整数 pp,让你求最小的正整数 nn ,使得 n!0(modp)n!\equiv 0\pmod p

但由于 pp 很大,将给出 mme1eme_1\dots e_m,表示 p=i=1mprieip=\prod\limits_{i=1}^m pr_i^{e_i} ,其中 pripr_i 是从小到大第 ii 个质数。

Format

输入格式

第一行一个正整数 mm

第二行包含 mm 个非负整数,其中第 ii 个数字表示 eie_i

输出格式

输出共 11 行,每行包含一个数字,表示该组数据的答案。

样例

input1

5
1 1 1 1 1

output1

11

input2

12
1 3 4 6 7 9 10 12 13 15 16 18

output2

666

提示

有一个绝妙的解释,但是这里太小,写不下。

1m100,0ei10181\le m\le 100,0\le e_i\le10^{18}

保证 pri×ei1018pr_i\times e_i\le10^{18}


SEEM和探姬的游戏

题目描述:

SEEM和探姬发明了一个新游戏。
游戏在树上进行,每个点有点权。
每次他们会选两个点 s,ts,t,并将一个棋子放在点 ss 上。
他们会轮流移动棋子,到过的点不能再走,并且他们会保证最后移到 tt 上。
SEEM先手,分数一开始为 asa_s
若当前是SEEM移动的,分数就减去到达点的点权,否则就加上到达点的点权。
SEEM想要答案尽可能小,探姬会让答案尽可能地大。
设最后的分数是 fs,tf_{s,t}
i=1nj=1nfi,j\sum\limits_{i=1}^n\sum\limits_{j=1}^n f_{i,j}

Format

输入格式

第一行一个数 nn,表示树的点数。
第二行 nn 个数,aia_i 表示第 ii 个点的点权。
接下来 n1n-1 行,每行两个数 x,yx,y 表示 xxyy 之间有一条边。

输出格式

一个数表示 i=1nj=1nfi,j\sum\limits_{i=1}^n\sum\limits_{j=1}^n f_{i,j}
109+710^9+7 取模。

样例

in1

4
-4 1 5 -2
1 2
1 3
1 4

out1

40

in2

8
-2 6 -4 -4 -9 -3 -7 23
8 2
2 3
1 4
6 5
7 6
4 7
5 8

out2

4

提示

数据保证 2n2×105,109ai1092\le n \le 2\times 10^5,-10^9\le a_i \le10^9


口算题卡_PWN2

from pwn import *

HOST = 'node5.anna.nssctf.cn'
PORT = 28516


def solve_problem(problem):
    problem = problem[8:]
    problem = problem.replace("?", "")
    print(problem)
    # 根据题目字符串解析出操作数和操作符
    op1, operator, op2 = problem.split()
    op1, op2 = int(op1), int(op2)
    # 根据操作符计算出答案
    if operator == '+':
        result = op1 + op2
    elif operator == '-':
        result = op1 - op2
    else:
        raise ValueError('Invalid operator: {}'.format(operator))
    return result


def eat():
    conn.recvline()


# 连接到指定的IP地址和端口号
conn = remote(HOST, PORT, level='DEBUG')
for _ in range(20):
    eat()
for i in range(100):
    # 接收问题并输出
    # 循环十次

    problem_msg = conn.recvline()  # What is 92 - 15?
    print(problem_msg.decode().strip())
    # 解决问题并发送答案
    answer = solve_problem(problem_msg.decode())
    conn.sendline(str(answer).encode())
    # 接收回复消息并判断是否回答正确
    reply_msg = conn.recvline()
    if b'Wrong!' in reply_msg:
        print(reply_msg.decode().strip())
        break
    else:
        print('Correct!')
# 输出最终的回复消息
final_msg = conn.recvline()
print(final_msg.decode().strip())
# 关闭连接
conn.close()

欧拉?

其中 又因为的步骤为 欧拉定理
定理中 gcd(a,n)=1gcd(a, n) = 1 的条件在此题中来自:

那道题n就两个素因子,都是512bit,m的比特数小于512,肯定互素啊 --KBU

import gmpy2
from Crypto.Util.number import long_to_bytes
 
n = 115140122725890943990475192890188343698762004010330526468754961357872096040956340092062274481843042907652320664917728267982409212988849109825729150839069369465433531269728824368749655421846730162477193420534803525810831025762500375845466064264837531992986534097821734242082950392892529951104643690838773406549
c = 406480424882876909664869928877322864482740577681292497936198951316587691545267772748204383995815523935005725558478033908575228532559165174398668885819826720515607326399097899572022020453298441
m=gmpy2.iroot(c,2)[0]
print(long_to_bytes(m))