December 8, 2022

初中数学remake

[公式] 韦达定理 [公式] 用法 1 [公式] 2 [公式] / [公式] / [公式] / [公式]
Read more
December 8, 2022

级数

级数 调和级数 调和级数的定义 调和级数是指这样一个数列: / [公式] 调和级数的性质 $\gamma$是欧拉常数,其值为 / [公式] / 明显的, $S(n)$为第$n$个调和数。 / 已知 / [公式] / 欧拉推导过调和级数有限多项式和的表达式为
Read more
November 17, 2022

2022四川省赛Crypto_WP

Crypto 写博客时的本机python环境:python 3.10 x64 cry1-babyRSA 题目附件 #!/usr/bin/env python3 import libnum import gmpy2 def main(): m = "" p = libnum.generate_prime(1024) q = libnum.generate_prime(1024) n = p * q e1 = 65537 e2 = 1145141 m = libnum.s2n(m) c1 = pow(m, e1, n) c2 = pow(m, e2, n) print(f"n = {n}") print(f"e1 = {e1}") print(f"e2 = {e2}") print(f"c1 = {c1}") print(f"c2 = {c2}") if __name__ == "__main__": main() # ------------ output ------------- # n = 11609263367794994463117283145812710043177521810736993971752031031462916890183901184704668542746877577916588155978013244385351397164066533771160861236441526284927774454246028029331726391203226023580325080150500633513024867014342350030181272221968801196510315424256352865890631054232306002238256568004250127485008008138279976475038656972273740968642332785779132654095393753232949667278798806004585797554024955342308244602767094536835410577382144435188162865642061122467384470501907391577779349252938141732012071206498806107556481558249549513041515803734342211746038126753951345855276903954190730328577080831957273691313 # e1 = 65537 # e2 = 1145141 # c1 = 8279258823057357102846768374381269167364145680055017957250521243478403606503599610855366519746944230676766499525422449675601214010991204564154995560170186683394412090168422510245266135032687364205431432451045158622417794414045719898864520112347836962316252383017549810699146506152781517871135246521405624365475969605452621085531890669372145482824845129281827033881675216546685064514926792907604133415349309151330709913454541960741984877203112442510747386406221828180805888471328964423290560512976977772551838742784356814497777401061881079781523967957560383718977490546677541952293716448514035557723329598904161762173 # c2 = 4995747575438050007737011353038705757162003396847797286289786278729187499823790079035532946676851313055563930519198963823829616599717198622635901839657079748022082189146477789049024407969208203999231434278100203042702919909473619456123328867313626560538182915794195719942071958092695261033449894563006040003298826647287929451919428024895476725340892133852628235964798488419924387986089462246202364608313134686465936926347848518960121189416319175083481701958106210362456062685045840587374473767109533027613795056920007028898921123363733374705988009798831764416119904696307107441325551226052940068337901039381485797771 解题思路 查看代码和注释掉的运行结果可知:m(密文)未知,已知e1,e2,c1,c2,n
Read more
October 3, 2022

快读模板A+b

stdin A+B / #include <iostream> typedef long long ll; using std::cout; const char endl = '\n'; namespace sscio { inline ll pull() { ll sign = 1LL,res = 0LL; char ch = getchar(); for (;!isdigit(ch);ch=getchar()) { if (ch == '-') { sign *= -1LL; } } for (;isdigit(ch);ch = getchar()) { res = (res << 3) + (res << 1) - '0' + ch; // *10 } return sign * res; } } void solve() { ll n=sscio::pull(); ll p=sscio::pull(); cout << n + p << endl; } signed main() { solve(); return 0 ^ 0; }
Read more
October 3, 2022

线性筛素数

【模板】线性筛素数 - 洛谷 / 【深基7.例2】质数筛 - 洛谷 / #include <iostream> #include <bitset> typedef long long ll; const int sz=1e8+10; namespace sscio { inline ll pull() { ll sign = 1LL,res = 0LL; char ch = getchar(); for (;!isdigit(ch);ch=getchar()) { if (ch == '-') { sign *= -1LL; } } for (;isdigit(ch);ch = getchar()) { res = (res << 3) + (res << 1) - '0' + ch; // *10 } return sign * res; } } using std::bitset; bitset<sz> primeTable; int primes[sz],prpp=0; void fetchPrimes(const int &ed) { //线性筛 形参为边界 primeTable.reset(); primeTable.set(0); primeTable.set(1); for(register int cx=2;cx<ed;cx++) { if(!primeTable[cx]) { primes[prpp++]=cx; } for (register int cy=0;cy<prpp&&cx*primes[cy]<ed;cy++) { //用质数来筛质数 primeTable.set(cx*primes[cy]); if (cx%primes[cy]==0) { break; } } } } void solve() { fetchPrimes(sz-6); int n=sscio::pull(); //n为查询范围,因为已经筛了超出题目范围素数了,所以无需处理 int p=sscio::pull(); //查询的个数 while(p--) { int k=sscio::pull(); //表示查询第 k 小的素数 printf("%d\n", primes[k-1]); //因为我们下标从零开始 所以是k - 1 } } signed main() { solve(); return 0 ^ 0; } #include <iostream> #include <bitset> typedef long long ll; const int sz=1e5+10; namespace sscio { inline ll pull() { ll sign = 1LL,res = 0LL; char ch = getchar(); for (;!isdigit(ch);ch=getchar()) { if (ch == '-') { sign *= -1LL; } } for (;isdigit(ch);ch = getchar()) { res = (res << 3) + (res << 1) - '0' + ch; // *10 } return sign * res; } } using std::bitset; bitset<sz> primeTable; int primes[sz],prpp=0; void fetchPrimes(const int &ed) { //线性筛 形参为边界 primeTable.reset(); primeTable.set(0); primeTable.set(1); for(register int cx=2;cx<ed;cx++) { if(!primeTable[cx]) { primes[prpp++]=cx; } for (register int cy=0;cy<prpp&&cx*primes[cy]<ed;cy++) { //用质数来筛质数 primeTable.set(cx*primes[cy]); if (cx%primes[cy]==0) { break; } } } } void solve() { fetchPrimes(sz-6); // int n=sscio::pull(); //n为查询范围,因为已经筛了超出题目范围素数了,所以无需处理 int p=sscio::pull(); //查询的个数 int cnt = 0; //空格数量 while(p--) { int k=sscio::pull(); if (!primeTable[k]) { if (cnt==0) { cnt++; } else { putchar(' '); } printf("%d", k); } } } signed main() { solve(); return 0 ^ 0; }
Read more
August 30, 2022

HWS-easyRSA-Wp

from Kotori 学长の小测验 / from secret import flag from Crypto.Util.number import * # seed = bytes_to_long(flag) bits = seed.bit_length() while True: p = getPrime(bits + 1) if p > seed: break print(p) a = getRandomRange(1, p) b = getRandomRange(1, p) for _ in range(3): seed = (a * seed + b) % p print(seed) # 31893593182018727625473530765941216190921866039118147474754069955393226712079257707838327486268599271803 # 25820280412859586557218124484272275594433027771091486422152141535682739897353623931875432576083022273940 # 24295465524789348024814588142969609603624462580932512051939198335014954252359986260009296537423802567677 # 14963686422550871447791815183480974143372785034397446416396172429864269108509521776424254168481536292904 RSA的计算过程是: / 任选两个大质数p和q,p!=q,计算N=pq 计算N的欧拉函数r(n)=(p-1)(q-1) 任选一个e满足 1<e<r(n) ,且e与r(n)互质 找到d,使e*d/r(n)=x……1(x是多少不重要,重要的是余数为1)后丢弃p, 至此(n,e)为公钥,(n,d)为私钥 加密:C=Me(mod n);解密:M=Cd(mod n) 下述推导来自 (RSA 介绍 - CTF Wiki)
Read more
August 26, 2022

AirDrop主题密码题Wp

一道AirDrop主题密码题wp / 题面 小A鼓起勇气向女神索要电话号码,但女神一定要考考他。女神说她最近刚看了一篇发表于安全顶会USENIX Security 2021的论文,论文发现苹果AirDrop隔空投送功能的漏洞,该漏洞可以向陌生人泄露AirDrop发起者或接收者的电话号码和电子邮箱。小A经过一番努力,获得了女神手机在AirDrop时传输的手机号哈希值,但再往下就不会了,你能继续帮助他吗?小A只记得女神手机号是170号段首批放号的联通号码。Hash:c22a563acc2a587afbfaaaa6d67bc6e628872b00bd7e998873881f7c6fdc62fc / flag格式:flag{13位电话号码(纯数字,含国家代码)}
Read more
May 25, 2022

代码本-数组入门

AcWing 数组的部分 #include<cstdio> int main() { char t; scanf("%c",&t); double q[12][12]; // 初始化后全部读入 for (int i = 0;i < 12; i ++ ) for (int j = 0;j < 12; j ++ ) scanf("%lf",&q[i][j]); double s = 0, c = 0; for (int i = 1; i <= 5; i ++ ) for (int j = 0;j < #(i - 1)#;j ++ ) { s += q[i][j]; c += 1; } for (int i = 6; i <= 10 ;i ++ ) for (int j = 0; j <= #(10 - i)#; j ++ ) { s += q[i][j]; c += 1; } if ( t == 'S') printf ("%.1lf\n",s); else printf("%.1lf\n", s / c ); return 0; }
Read more
May 6, 2022

密码学脚本记录

看题目中由 encode 可以猜到是一种编码方式 来源 / <?php /* convert_uudecode() 函数对 uuencode 编码的字符串进行解码。 该函数常与 convert_uuencode() 函数一起使用。 */ $str = "Hello world!"; // 对字符串进行编码 $encodeString = convert_uuencode($str); echo $encodeString . "<br>"; // 对字符串进行解码(注意转义字符) $decodeString = convert_uudecode($encodeString); echo $decodeString; ?> 去这里运行试试>>>PHP在线运行
Read more
May 5, 2022

N皇后

BV14Y4y1C7SW 以下是错误代码 / #include <bits/stdc++.h> using namespace std; int hash[10][10]; int cnt; void doAdd(int r, int c, int n, int val) { if (r < 0 || r >= n) { return ; } if (c < 0 || c >= n) { return ; } hash[r][c] += val; } void add(int r, int c, int n, int val) { int i; for (i = 0; i < n; i++) { doAdd(r, i, n, val); doAdd(i, c, r, val); } for (i = 0; i < n; i++) { doAdd(r + 1, c + 1, n, val) doAdd(r - 1, c - 1, n, val) doAdd(r + 1, c - 1, n, val) doAdd(r - 1, c + 1, n, val) } } void dfs(int depth, int maxDepth) { int i; if (depth == maxDepth) { ++cnt; return ; } for (i = 0; i < maxDepth; i++) { if (hash[depth][i] == 0) { add(depth, i, maxDepth, i); dfs(depth + 1, maxDepth); add(depth, i, maxDepth, -i) } } } int main() { int n; cin >> n; memset(hash, 0, sizeof(hash)); dfs(0, n); return cnt; } package PACK6; // https://www.bilibili.com/video/BV14Y4y1C7SW public class N皇后 { // 首先定义一个哈希表 hash ij大于0 表示这个位置不能放皇后 static int[][] hash = new int[10][10]; // 定义全局变量cnt 表示方案数 static int cnt; public static void doADD(int r, int c, int n, int val) { // 如果行的范围越越界则标记无效 if (r < 0 || r >= n) { return; } // 如果列的范围越越界则标记无效 if (c < 0 || c >= n) { return; } // 如果对应位置是安全的,也就是没有皇后能够攻击到,则标记为1 // (否则在对应位置的hash数组执行标记) if (hash[r][c] == 0) { hash[r][c] = val; } } // 实现放置皇后的过程 public static void add(int r,int c ,int n,int val) { // val = 1; // 代表(r,c)位置放置了一个皇后 // val = -1; // 代表(r,c)位置取出了一个皇后 int i; for (i = 0; i < n; i++) { // 每放入一个皇后,需要将他所在的行,所在的列,所在的对角线 都进行标记 doADD(r, i, n, val); // 标记所在行 doADD(i, c, n, val); // 标记所在列 } for (i = 1; i <= n; i++) { // 标记主对角线 doADD(r + i, c + i, n, val); doADD(r - i, c - i, n, val); // 标记副对角线 doADD(r + i, c - i, n, val); doADD(r - i, c + i, n, val); } } public static void dfs(int depth, int maxDepth) { // 当前要放置的行号和总共要放置的行数 // 如果当前行数==总行数 方案数+1 函数直接返回 if (depth == maxDepth) { cnt++; return; } // 在当前行的每一列 for (int i = 0; i < maxDepth; i++) { // 如果发现有对应位置是安全的,也就是没有皇后能够攻击到, if (hash[depth][i] == 0) { // 则调用add放置一个皇后 add(depth, i, maxDepth, 1); // 递归求解下一行 dfs(depth + 1, maxDepth); // 递归退出后,删除放置的皇后(取回前面放置的皇后) add(depth, i, maxDepth, -1); } } } public static int fakeMain(int n) { // 初始化cnt = 0; cnt = 0; // 初始化hash ij = 0,表示一开始一个空的棋盘 for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { hash[i][j] = 0; } } // 递归模拟每一行放置皇后后的情况 dfs(0, n); return cnt; } public static void main(String[] args) { fakeMain(4); } } class Solution { int hash[10][10]; int cnt; // 实现标记 void doAdd(int r, int c, int n, int val) { // 如果行的范围越界 则标记失败 if (r < 0 || r >= n) { return; } // 如果列的范围越界 则标记失败 if (c < 0 || c >= n) { return; } // 否则在对应的位置上的hash数组执行标记 hash[r][c] += val; } // 实现放置皇后的过程 void add(int r,int c,int n,int val) { int i; for (i = 0; i < n; i++) { doAdd(r,i,n,val); doAdd(i,c,r,val); } for (i = 0; i < n; i++) { // 标记主对角线 doAdd(r+i,c+i,n,val); doAdd(r-i,c-i,n,val); // 标记副对角线 doAdd(r+i,c-i,n,val); doAdd(r-i,c+i,n,val); } } void dfs(int depth, int maxDepth) { int i; if(depth == maxDepth) { ++cnt; return ; } for (i = 0; i < maxDepth; i++) { if(hash[depth][i] == 0) //对应位置安全,没有皇后能攻击到 { // 则调用add放置一个皇后 add(depth, i, maxDepth , 1); // 递归求解下一行 dfs(depth + 1, maxDepth); // 递归推出后,取出皇后 add(depth, i, maxDepth, -1); } } } public: int totalNQueens(int n) { cnt = 0; memset(hash, 0, sizeof(hash)); dfs(0,n); return cnt; } }
Read more