最新文章

secret base ~君がくれたもの~/茅野愛衣等 日中罗马音歌词

secret base ~君がくれたもの~/茅野愛衣等 日中罗马音歌词

secret base ~君がくれたもの~ 作词:町田紀彦 作曲:町田紀彦 歌:茅野愛衣  

六等星の夜/Aimer 日中罗马音歌词

六等星の夜/Aimer 日中罗马音歌词

六等星の夜 作词:Aimer 作曲:飛内将大 歌:Aimer 下载Word格式文档(.do 

僕らの戦場/ワルキューレ 日中罗马音歌词

僕らの戦場/ワルキューレ 日中罗马音歌词

僕らの戦場

作词:唐沢美帆 / 加藤裕介
作曲:加藤裕介
歌:ワルキューレ

下载Word格式文档(.docx)

歌词来源:僕らの戦場 – ワルキューレ – 单曲 – 网易云音乐
翻译来源:僕らの戦場 – ワルキューレ – 单曲 – 网易云音乐
翻译作者:诸星秀树 – 用户 – 网易云音乐
信息来源:Walküre Attack! | Bangumi 番组计划
罗马音来源:自制 航空母艦飛龍 – 用户 – 网易云音乐
协力:Google 翻译

たとえば途切れた空が見えたなら
Tatoeba togireta sora ga mietanara
倘若看到了天空不再变换
震える僕の声が聞こえるのなら
Furueru boku no koe ga kikoeru nonara
倘若听到了我颤抖的声音
バラバラに砕けるほど舞い上がれ
Barabara ni kudakeru hodo maiagare
舞动的身躯仿佛随时会破碎
引き裂かれた記憶の果敢なきツバサ
Hikisaka reta kioku no hate naki Tsubasa
撕裂的记忆中那无边的羽翼

あの日 語り合ったこと
Ano hi katariatta koto
还记得那天我们促膝长谈
いつも 笑い合えたこと
Itsumo warai aeta koto
自始至终不由得相视而笑
よみがえる日まで 立ち上がるだけ
Yomigaeru hi made tachiagaru dake
只能坚强面对 直至苏醒之日

壊して
Kowashite
破坏吧
もっと もっと 僕を感じて
Motto motto boku o kanjite
更多地 更多地 去感受我的存在
そこに そこに 君は居ますか
Soko ni soko ni kimi wa imasu ka
在哪里 在哪里 你是否就在那里
戦場に咲く命よ
Senjō ni saku inochi yo
在战场中盛放的生命啊
燃えろ 燃えろ
Moero moero
燃烧吧 燃烧吧
殺して
Koroshite
抹杀吧
いっそ いっそ 朽ち果てるなら
Isso isso kuchihaterunara
倘若就此枯于腐朽之中的话
たぎれ たぎれ 破滅の果てに
Tagire tagire hametsu no hate ni
我宁可去断绝这毁灭的终末
奇跡を呼び覚ませ
Kiseki o yobisamase
唤醒奇迹
閉ざされた空へ
Tozasareta sora e
飞向那被封闭的天空

飛び交う無数の感覚のなかで
Tobikau musū no kankaku no naka de
在无数交织着的感觉之中
本当の自分さえも失くしてしまう
Hontōno jibun saemo nakushite shimau
连真正的自我也迷失其中
見えない不安を集中砲火に
Mienai fuan o shūchū hōka ni
向着看不到的不安集中火力
勝ち残るのは弱さ認める強さ
Kachinokoru nowa yowa-sa mitomeru tsuyo-sa
胜者靠的是强大而并非软弱

もしも 僕じゃなかったら
Moshimo boku janakattara
倘若此生你遇见的不是我
もしも 君じゃなかったら
Moshimo kimi janakattara
倘若此生我遇见的不是你
こんな気持ちさえ
Kon’na kimochi sae
连这样的心情
知らずにいたね
Shirazuni ita ne
都不曾知道呢

切り裂け
Kirisake
划破吧
もっと もっと 正義の闇へ
Motto motto seigi no yami e
更多地 更多地 向着正义的黑暗
はしれ はしれ 灰になるまで
Hashire hashire hai ni naru made
狂奔吧 狂奔吧 直至燃烧成灰烬
理屈を捨てて
Rikutsu o sutete
摒弃借口
心で 吠えろ 吠えろ
Kokoro de hoero hoero
心在咆哮 在咆哮

断ち切れ
Tachikire
切断吧
やがてやがて 生まれる銀河(ほし)に
Yagate yagate umareru hoshi ni
不久前 不久前 在刚诞生的银河里
君が 君が居てくれるなら
Kimi ga kimi ga ite kurerunara
如果你 如果你 能够陪伴在我身边
僕らのかがやきは
Bokura no kagayaki wa
两人间的光辉
無敵にもなれる
Muteki ni mo nareru
必将无可匹敌

右にならえと
Migi ni narae to
只要随波逐流
誰もが今日を生きてる
Daremoga kyō o iki teru
谁都可以幸存
もどかしさに
Modokashi-sa ni
心中焦躁不安
理由もないまま
Riyū mo nai mama
却找不出理由
死んだみたいに
Shinda mitai ni
犹如逝去一般
生きていくよりも
Ikiteiku yori mo
与其苟活下去
赤い血を流し牙を剥け
Akai chi o nagashi kiba o muke
不如流淌鲜血露出爪牙
それが僕が君が
Sore ga boku ga kimi ga
那才是你我之间
生きてる証明(あかし)
Iki teru akashi
活着的证明

壊して
Kowashite
破坏吧
もっと もっと 僕を感じて
Motto motto boku o kanjite
更多地 更多地 去感受我的存在
そこに そこに 君は居ますか
Soko ni soko ni kimi wa imasu ka
在哪里 在哪里 你是否就在那里
戦場に咲く命よ
Senjō ni saku inochi yo
在战场中盛放的生命啊
燃えろ 燃えろ
Moero moero
燃烧吧 燃烧吧

殺して
Koroshite
抹杀吧
いっそ いっそ 朽ち果てるなら
Isso isso kuchihaterunara
倘若就此枯于腐朽之中的话
たぎれ たぎれ 破滅の果てに
Tagire tagire hametsu no hate ni
我宁可去断绝这毁灭的终末
奇跡を呼び覚ませ
Kiseki o yobisamase
唤醒奇迹
閉ざされた空へ
Tozasareta sora e
飞向那被封闭的天空

二分图匹配的一种算法:匈牙利算法

二分图匹配的一种算法:匈牙利算法

这里不介绍算法,只提供模板代码。所有代码基于【P3386】【模板】二分图匹配 &#8211 

郧阳中学12/24周考题解

郧阳中学12/24周考题解

命题人 KSkun 题目列表 赛题 #A: 负负得正 | 数学,数论,组合数学 赛题 #B 

数学笔记:数论

数学笔记:数论

欧拉函数(Eular’s Totient Function)

定义

在数论中,对正整数n,欧拉函数\varphi(n)是小于或等于n的正整数中与n互质的数的数目。
规定:\varphi(1) = 1

费马小定理(Fermat’s Little Theorem)

若a是一个整数,p是一个质数,则
a^{p-1} \equiv 1 \ (mod \ p)

欧拉定理(Eular’s Theorem (Number Theory))

若n,a为正整数,且gcd(n, a) = 1,则
a^{\varphi(n)} \equiv 1 \ (mod \ n)

欧拉函数值的求解

直接公式求解

欧拉函数的值计算有以下公式
\varphi(x) = x (1 - \frac{1}{p_1}) (1 - \frac{1}{p_2}) \cdots (1 - \frac{1}{p_k})
其中p_i代表x的质因数。
因此我们可以枚举x的质因数,并计算\varphi(x)的值。
这个算法单次计算的复杂度是O(\sqrt{n})

线性筛法求解

本方法适用于求1至n的函数值计算。
首先,我们知道欧拉函数是一个积性函数,即\varphi(nm) = \varphi(n) \varphi(m)
对于素数,它的函数值就是它本身减1。对于非素数,我们想到了线性筛法的避免重复计算条件:prime[j]是i的一个因数。此时,我们已经知道了\varphi(prime[j])\varphi(i),那么可以算出\varphi(i \cdot prime[j]) = \varphi(i) \varphi(prime[j])
这个算法的复杂度是O(n)
代码实现如下:

inline void phi_solve(int n) {
    phi[1] = 1;
    for(int i = 2; i <= n; i++) {
        if(!vis[i]) {
            prime[tot++] = i;
            phi[i] = i - 1;
        }
        for(int j = 0; j < tot; j++) {
            vis[i * prime[j]] = true;
            if(i % prime[j] == 0) {
                phi[i * prime[j]] = phi[i] * prime[j];
                break;
            } else {
                phi[i * prime[j]] = phi[i] * phi[prime[j]];
            }
        }
    }
}

阶(Order)

定义

若a,p为正整数,且gcd(a, p) = 1,称满足a^r \equiv 1 \ (mod \ p)的最小正整数r为a模p的阶,记作Ord_p(a)

常用性质

  1. 若a,p为正整数,且gcd(a, p) = 1,r为a模p的阶,若有正整数m满足a^m \equiv 1 \ (mod \ p),则r|m
  2. 若a,p为正整数,且gcd(a, p) = 1,r为a模p的阶,则r|\varphi(m)
  3. 若a,p为正整数,且gcd(a, p) = 1a^i \equiv a^j \ (mod \ p)当且仅当i \equiv j \ (mod \ Ord_p(a))

求解阶

没什么好办法,从小到大枚举r并判断是否是阶。

原根(Primitive Root)

定义

若a,p为正整数,且gcd(a, p) = 1,称满足Ord_p(a) = \varphi(p)的a叫做模p的一个原根。
注意:不是任何p都存在原根。每个素数都存在原根。

常用性质

  1. 当a为m的原根时,a^0, a^1, a^2, \cdots, a^{m-1}构成了m的一个简化剩余类。
  2. 模m有原根的充要条件是m=2, 4, p^n, 2p^n,其中p为奇素数,n为任意正整数。

求解原根

我们知道了上述阶的性质2,要判断某数是不是模m的原根,可以验证是否存在m-1的一个约数a满足g^a \equiv 1 \ (mod \ m),如果有的话那么g的阶就不是m-1,则g不是模m的原根。
一般来说原根不会很大,从2开始枚举并按照上述方法判断就可以得到。
代码如下

inline int solve_g(int m) {
    // 预处理出因数 
    int fact[105], tot = 0, x = m - 1;
    for(int i = 2; i * i <= x; i++) {
        if(x % i == 0) {
            fact[tot++] = (m - 1) / i;
            while(x % i == 0) x /= i;
        }
    }
    if(x > 1) fact[tot++] = (m - 1) / x;

    // 枚举原根
    bool success;
    for(int i = 2;; i++) {
        success = true;
        for(int j = 0; j < tot; j++) {
            if(fpow(i, fact[j], m) == 1) {
                success = false;
                break;
            }
        }
        if(success) return i;
    }
}

注:代码中fpow()函数是快速幂取模。

应用:乘法换加法(取模意义下)

我们知道,任何一个小于正整数m的正整数都可以表示为原根的某次幂,那么求一个由小于m正整数组成的数列的累乘值可以转化为原根的指数求和,这样可以不用计算高精度,且由周期性还可以缩小指数的范围。

例题:[SDOI2015]序列统计

题目描述

小C有一个集合S,里面的元素都是小于M的非负整数。他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数列中的每个数都属于集合S。小C用这个生成器生成了许多这样的数列。但是小C有一个问题需要你的帮助:给定整数x,求所有可以生成出的,且满足数列中所有数的乘积mod M的值等于x的不同的数列的有多少个。小C认为,两个数列{Ai}和{Bi}不同,当且仅当至少存在一个整数i,满足Ai≠Bi。另外,小C认为这个问题的答案可能很大,因此他只需要你帮助他求出答案mod 1004535809的值就可以了。

输入输出格式

输入格式:
一行,四个整数,N、M、x、|S|,其中|S|为集合S中元素个数。第二行,|S|个整数,表示集合S中的所有元素。
输出格式:
一行,一个整数,表示你求出的种类数mod 1004535809的值。

输入输出样例

输入样例#1:

4 3 1 2
1 2

输出样例#1:

8

说明

【样例说明】
可以生成的满足要求的不同的数列有(1,1,1,1)、(1,1,2,2)、(1,2,1,2)、(1,2,2,1)、(2,1,1,2)、(2,1,2,1)、(2,2,1,1)、(2,2,2,2)。
【数据规模和约定】
对于10%的数据,1<=N<=1000;
对于30%的数据,3<=M<=100;
对于60%的数据,3<=M<=800;
对于全部的数据,1<=N<=109,3<=M<=8000,M为质数,1<=x<=M-1,输入数据保证集合S中元素不重复

解释

对于本题我们需要求出数列中所有元素的乘积,我们可以应用乘法转加法得到数列乘积的原根指数,再将x处理成原根的某次幂,根据阶的性质3即可判定是否同余。
本题的完整题解参见[SDOI2015]序列统计 题解 | KSkun’s Blog

威尔逊定理(Wilson’s theorem)

当且仅当p为素数时,有 (p-1)! \equiv -1 \pmod{p}

积性函数(Multiplicative function)

定义

积性函数是指一个定义域为正整数n的数论函数f(n),有如下性质:
\begin{aligned} & f(1) = 1 \\ & f(ab) = f(a)f(b) & (a, b) = 1 \end{aligned}
如果上述性质中,不要求a、b互质,即不只a、b互质的情况下都有f(ab) = f(a)f(b),则f(n)为完全积性函数。

常见的积性函数

  • \varphi(n)欧拉函数
  • \mu(n):莫比乌斯函数
  • \mathrm{gcd}(a, k):最大公因数(当k为定值时)
  • 1(n):常函数,定义为1(n)=1(完全积性)

更多内容可以参见积性函数 – 维基百科,自由的百科全书

参考资料

郧阳中学12/3周考题解

郧阳中学12/3周考题解

这周周考被基础算法虐翻了。%%%wxgdalao 命题人 wxg 题目列表 赛题 #A:  

最小费用最大流的一种算法:SPFA版Edmons-Karp

最小费用最大流的一种算法:SPFA版Edmons-Karp

这里不介绍算法,只提供模板代码。所有代码基于【P3381】【模板】最小费用最大流 &#82 

最大流的三种算法:Ford-Fulkson、Edmons-Karp、Dinic

最大流的三种算法:Ford-Fulkson、Edmons-Karp、Dinic

这里不介绍算法,只提供模板代码。所有代码基于【P3376】【模板】网络最大流 – 洛谷一题。

Ford-Fulkson

// Code by KSkun, 2017/11
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>

struct io {
    char buf[1 << 26], *s;

    io() {
        fread(s = buf, 1, 1 << 26, stdin);
    }

    inline int read() {
        register int res = 0;
        while(*s < '0' || *s > '9') s++;
        while(*s >= '0' && *s <= '9') res = res * 10 + *s++ - '0';
        return res;
    }
} ip;

#define read ip.read

const int MAXN = 100005;
const int INF = 1e9;

struct Edge {
    int to, cap, rev;
    Edge(int to, int cap, int rev): to(to), cap(cap), rev(rev) {}
};

std::vector<Edge> vec[MAXN];
bool vis[MAXN];

inline void addedge(int u, int v, int cap) {
    vec[u].push_back(Edge(v, cap, vec[v].size()));
    vec[v].push_back(Edge(u, 0, vec[u].size() - 1));
}

// Ford-Fulkerson DFS
inline int dfs(int u, int t, int f) {
    if(u == t) return f;
    vis[u] = true;
    for(int i = 0; i < vec[u].size(); i++) {
        int v = vec[u][i].to;
        if(!vis[v] && vec[u][i].cap > 0) {
            int nxt = dfs(v, t, std::min(f, vec[u][i].cap));
            if(nxt > 0) {
                vec[u][i].cap -= nxt;
                vec[v][vec[u][i].rev].cap += nxt;
                return nxt;
            }
        } 
    }
    return 0;
}

inline int max_flow(int s, int t) {
    int flow = 0;
    for(;;) {
        memset(vis, 0, sizeof vis);
        int f = dfs(s, t, INF);
        if(f == 0) return flow;
        flow += f;
    }
}

int n, m, s, t, ut, vt, wt;

int main() {
    n = read();
    m = read();
    s = read();
    t = read();
    for(int i = 0; i < m; i++) {
        ut = read();
        vt = read();
        wt = read();
        addedge(ut, vt, wt);
    }
    printf("%d", max_flow(s, t));
    return 0;
}

Edmons-Karp

// Code by KSkun, 2017/11
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
#include <utility> 
typedef std::pair<int, int> pairi;

struct io {
    char buf[1 << 26], *s;

    io() {
        fread(s = buf, 1, 1 << 26, stdin);
    }

    inline int read() {
        register int res = 0;
        while(*s < '0' || *s > '9') s++;
        while(*s >= '0' && *s <= '9') res = res * 10 + *s++ - '0';
        return res;
    }
} ip;

#define read ip.read

const int MAXN = 100005;
const int INF = 1e9;

struct Edge {
    int to, cap, rev;
    Edge(int to, int cap, int rev): to(to), cap(cap), rev(rev) {}
};

std::vector<Edge> vec[MAXN];
std::queue<int> que;
int f[MAXN];
pairi pre[MAXN];

inline void addedge(int u, int v, int cap) {
    vec[u].push_back(Edge(v, cap, vec[v].size()));
    vec[v].push_back(Edge(u, 0, vec[u].size() - 1));
}

// Edmons-Karp BFS

inline int max_flow(int s, int t) {
    int flow = 0;
    for(;;) {
        memset(f, 0, sizeof f);
        while(!que.empty()) que.pop();
        que.push(s);
        f[s] = INF;
        while(!que.empty()) {
            int u = que.front();
            que.pop();
            for(int i = 0; i < vec[u].size(); i++) {
                int v = vec[u][i].to;
                if(f[v] == 0 && vec[u][i].cap > 0) {
                    pre[v] = std::make_pair(u, i);
                    f[v] = std::min(f[u], vec[u][i].cap);
                    que.push(v);
                }
            }
            if(f[t] != 0) break;
        }
        if(f[t] == 0) break;
        for(int u = t; u != s; u = pre[u].first) {
            vec[pre[u].first][pre[u].second].cap -= f[t];
            vec[u][vec[pre[u].first][pre[u].second].rev].cap += f[t];
        }
        flow += f[t];
    }
    return flow;
}

int n, m, s, t, ut, vt, wt;

int main() {
    n = read();
    m = read();
    s = read();
    t = read();
    for(int i = 0; i < m; i++) {
        ut = read();
        vt = read();
        wt = read();
        addedge(ut, vt, wt);
    }
    printf("%d", max_flow(s, t));
    return 0;
}

Dinic

// Code by KSkun, 2017/11
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>

struct io {
    char buf[1 << 26], *s;

    io() {
        fread(s = buf, 1, 1 << 26, stdin);
    }

    inline int read() {
        register int res = 0;
        while(*s < '0' || *s > '9') s++;
        while(*s >= '0' && *s <= '9') res = res * 10 + *s++ - '0';
        return res;
    }
} ip;

#define read ip.read

const int MAXN = 100005;
const int INF = 1e9;

struct Edge {
    int to, cap, rev;
    Edge(int to, int cap, int rev): to(to), cap(cap), rev(rev) {}
};

std::vector<Edge> vec[MAXN];
std::queue<int> que;
int level[MAXN];

inline void addedge(int u, int v, int cap) {
    vec[u].push_back(Edge(v, cap, vec[v].size()));
    vec[v].push_back(Edge(u, 0, vec[u].size() - 1));
}

// Dinic 

inline bool bfs(int s, int t) {
    memset(level, -1, sizeof level);
    level[s] = 0;
    que.push(s);
    while(!que.empty()) {
        int u = que.front();
        que.pop();
        for(int i = 0; i < vec[u].size(); i++) {
            int v = vec[u][i].to;
            if(level[v] == -1 && vec[u][i].cap > 0) {
                level[v] = level[u] + 1;
                que.push(v);
            }
        } 
    }
    return level[t] != -1;
}

inline int dfs(int u, int t, int left) {
    if(u == t || left == 0) return left;
    int flow = 0;
    for(int i = 0; i < vec[u].size(); i++) {
        int v = vec[u][i].to;
        if(vec[u][i].cap > 0 && level[v] == level[u] + 1) {
            int d = dfs(v, t, std::min(left, vec[u][i].cap));
            if(d > 0) {
                vec[u][i].cap -= d;
                vec[v][vec[u][i].rev].cap += d;
                flow += d;
                left -= d;
                if(left == 0) break;
            }
        }
    }
    return flow;
}

inline int max_flow(int s, int t) {
    int flow = 0;
    while(bfs(s, t)) {
        flow += dfs(s, t, INF);
    }
    return flow;
}

int n, m, s, t, ut, vt, wt;

int main() {
    n = read();
    m = read();
    s = read();
    t = read();
    for(int i = 0; i < m; i++) {
        ut = read();
        vt = read();
        wt = read();
        addedge(ut, vt, wt);
    }
    printf("%d", max_flow(s, t));
    return 0;
}
NOIP2017提高组题解&总结

NOIP2017提高组题解&总结

本篇题解借鉴和参考了洛谷题解区的同学所写的题解以及部分博文,由于未能记录全面,并没能将这些