mod函数

huntian oy1

和自甴很熟 提交于 2019-12-02 09:31:06
---恢复内容开始--- huntian oy 问题类别 杜教筛 算法类别 数论 其他知识点 无 来源 HDU-6706 Problem Description One day, Master oy created a new function to celebrate his becoming a 'huntian' in majsoul. $f(n,a,b)=\sum_{i=1}^n \sum_{j=1}^i gcd(i^a−j^a,i^b−j^b)[gcd(i,j)=1]%(10^9+7)$ Given n, a and b, Master oy wanted Newbie jj who was still a 'chuxin' to answer the value of f(n,a,b). Input There are multiple test cases. The first line contains an integer T, indicating the number of test cases. For each test case, there are three positive integers n, a and b which are separated by spaces. It's guaranteed that a and b are

卡常小技巧(不定时更新)

我是研究僧i 提交于 2019-12-02 04:48:16
整理一些常见的和冷门的卡常技巧,欢迎大家评论补充。 1.定义常量const int 给定mod用const int,mod用的多的话时间至少减半(有一次比赛题目TLE了,考完加了const从3.1s->1.2s) 2.寄存器register的使用 一般用在循环中用register int,不要滥用,不然可能会出现玄学错误! register int 亲测在for循环中时间为直接int的1/5,减少了4/5! 3.函数化   inline int add(int a,int b) {return a+b>mod?a+b-mod:a+b;}   inline int sub(int a,int b) {return a-b>=0?a-b:a-b+mod;}   inline int mul(int a,int b) {return 1ll*a*b%mod;} 比直接(a+b)%mod,(a-b)%mod要快一点,至于mul是为了 好看 防止忘记加1ll。 inline 一般用于比较短的,使用频率高的函数,它快的原因是把函数封装起来了, 缺点是调试时不能看到内部(网上看见的,自己调试的时候似乎没什么问题). inline 是对编译器的一个建议,不是命令,所以对于实现过程复杂的函数(如递归,需要传递参数) 编译器不会采取建议,inline是无效的。 4.位运算 比如x<<=1代替x*=2啊

浅谈密码学中数论基础

匆匆过客 提交于 2019-12-02 01:12:23
浅谈密码学中数论基础 1.模运算1765243235 模运算也可以称为取余运算,例如 23≡11(mod12),因此如果a=kn+b,也可以表示为a ≡ b(mod n),运算规则: (a+b) mod n = ((a mod n) + (b mod n))mod n (a*b) mod n = ((a mod n) * (b mod n)) mod n 完全剩余集合 1~n-1构成了自然数n的完全剩余集合,对于任意一个整数m%n都存在于1~n的集合中。 构造加法链 在加密算法中,运用到了大量的取模运算,对于一个k位数模n,所有的运算例如加减乘除中间结构将不会超过2k位,因此例如a x mod n将会大大简化计算时的复杂度。 例如a 8 mod n 在计算时可以这样计算 ((a 2 mod n) 2 mod n) 2 mod n 当指数x不是2的倍数时则需要构造加法链,例如25,25 = 16 + 8 +1 = 2 4 + 2 3 + 2 0 因此a 25 mod n = (a * a 8 * a 16 ) mod n = ((((a 2 * a) 2 ) 2 ) 2 *a)mod n C语言表示 unsigned long ss(unsigned long x , unsigned long y , unsigned long n) { unsigned long s,t,u;

[CSP校内集训]2019.10.16数学专题

不羁岁月 提交于 2019-12-01 13:13:36
\(T1:facsum\) 题目 Mr.Hu最近偶得一函数 \[f(n) = n^m \times \sum_{d|n}{\sigma_0(d)\mu(\frac{n}{d})\frac{n}{d}}\] 求 \(F(n) = \sum_{i=1}^n{f(i)},(n\leq 10^7,m\leq 10)\) 做法 数论函数掠杀我qwq 可以看出右边那个 \(\sum\) 里面的三个部分都是积性函数,所以它们的乘积也是积性函数,通过计算/打表/瞎猜可知: 当 \(p\) 为质数时,有 \(f(p) = 2-p\) 对于 \(p^x\) ,有 \(f(p^x) = -x*p + x + 1\) 线性筛一遍即可求解 Code #include<bits/stdc++.h> #define N 10000005 #define re register using namespace std; typedef long long ll; const ll mod = 1000000007; int n,m; int p[N],d[N],c[N],v[N],cnt; bool isnotp[N]; template <class T> void read(T &x) { char c;int sign=1; while((c=getchar())>'9'||c<'0') if(c=='-'

常用数论

▼魔方 西西 提交于 2019-12-01 06:17:18
费马小定理 \(a^{p-1}\equiv1\pmod{m}\ (p是质数)\) 求逆元 方法一:扩展欧几里得算法 前提: \(a\) 和 \(p\) 互质 原理: \(a*x\equiv1\pmod{p} \\ a*x+p*y=1\) \(x\) 就是我们要求的逆元 LL exgcd(LL a,LL b,LL &x,LL &y)//扩展欧几里得算法 { if(b==0) { x=1,y=0; return a; } LL ret=exgcd(b,a%b,y,x); y-=a/b*x; return ret; } LL getInv(int a,int mod)//求a在mod下的逆元,不存在逆元返回-1 { LL x,y; LL d=exgcd(a,mod,x,y); return d==1?(x%mod+mod)%mod:-1; } 方法二:费马小定理 前提: \(a\) 和 \(p\) 互质且 \(p\) 为素数 原理: \(a^{p-1}\equiv1\pmod{p}\ (p是质数) \\ inv(a)=a^{p-2}\pmod{p}\) 中国剩余定理 #include<iostream> #include<cstdio> using namespace std; typedef long long LL; LL exgcd(LL a,LL b,LL &x,LL &y) {

浅谈密码学中数论基础

三世轮回 提交于 2019-11-30 06:40:38
1.模运算(mod) 模运算也可以称为取余运算,例如 23≡11(mod12),因此如果a=kn+b,也可以表示为a ≡ b(mod n),运算规则: (a+b) mod n = ((a mod n) + (b mod n))mod n (a*b) mod n = ((a mod n) * (b mod n)) mod n 完全剩余集合 1~n-1构成了自然数n的完全剩余集合,对于任意一个整数m%n都存在于1~n的集合中 。 构造加法链 在加密算法中,运用到了大量的取模运算,对于一个k位数模n,所有的运算例如加减乘除中间结构将不会超过2k位,因此例如a x mod n将会大大简化计算时的复杂度。 例如a 8 mod n 在计算时可以这样计算 ((a 2 mod n) 2 mod n) 2 mod n 当指数x不是2的倍数时则需要构造加法链,例如25,25 = 16 + 8 +1 = 2 4 + 2 3 + 2 0 因此a 25 mod n = (a * a 8 * a 16 ) mod n = ((((a 2 * a) 2 ) 2 ) 2 *a)mod n C语言表示 unsigned long ss(unsigned long x , unsigned long y , unsigned long n) { unsigned long s,t,u; int i ; s = 1;

Comet 67E: ffort

天大地大妈咪最大 提交于 2019-11-30 05:55:25
题目传送门: Comet 67E 。 用了个傻逼做法 A 了这题,欢迎观赏睿智做法! 题意简述: 题目说得很清楚了(这次是我不想写了)。 题解: 为了方便,令 \(m\) 为敌人数, \(n\) 为己方士兵种数。设 \(\mathbf{Ans}\) 为答案,则有: \[\begin{aligned}\mathbf{Ans}&=\sum_{a=1}^{\infty}([x^a]G)\cdot\binom{a-1}{m-1}\\&=\sum_{a=0}^{\infty}\!\left([x^{a}]\dfrac{G}{x}\right)\!\cdot\binom{a}{\hat m}\\&=\frac{1}{\hat m!}\sum_{i=0}^{\infty}([x^i]F)i^{\underline{\hat m}}\\\end{aligned}\] 意即枚举 \(a\) 为打出的伤害数,则将这些伤害分配给敌人的方法数为 \(\dbinom{a-1}{m-1}\) 。 其中 \(G\) 为给己方士兵分配伤害的方案数的 \(\mathbf{OGF}\) ,即 \(\displaystyle G=\prod_{i=1}^{n}\left[\mathbf{OGF}\left\{0,\underset{b_i}{\underbrace{1,\ldots,1}}\right\}\right]

LOJ2527「HAOI2018」染色

丶灬走出姿态 提交于 2019-11-30 01:30:50
Description 题目链接 给定长为 \(n\) 的序列,你需要用 \(m\) 种颜色为其染色。若一种染色方案中恰好出现 \(S\) 次的颜色有 \(K\) 种,那么它的代价为 \(W_K\) 。求所有可能的染色方案的代价总和对 \(1004535809\) 取模的结果 \(n\le 10^7,m\le 10^5,S\le 150,0\le W_i<1004535809\) Solution 考虑到如果一种染色方案中出现 \(S\) 次的颜色种数定了,它的代价也就定了,所以我们可以先算出恰好出现 \(S\) 次的颜色有 \(K\) 种的方案数,再对应乘上 \(W_K\) 就是我们要的结果了 先写出暴力的 \(\text{DP}\) 方程,设 \(dp_{i,j,k}\) 表示已经用前 \(i\) 种颜色给序列上 \(j\) 个位置染过色了,其中恰好染了 \(S\) 次的颜色有 \(k\) 种的方案数,那么有 \[ dp_{i,j,k}=\dbinom{n-j+S}{S}dp_{i-1,j-S,k-1}+\sum\limits_{0\le c\le j且c\not=S}\dbinom{n-j+c}{c}dp_{i-1,j-c,k} \] 答案就是 \(\sum\limits_{i=0}^{m}dp_{m,n,i}W_i\) ,复杂度 \(O(n^2m^2)\) 考虑生成函数

CF960G Bandit Blues

久未见 提交于 2019-11-29 16:33:18
Description 计算 \(1...n\) 的全排列中不同的前缀最大值的个数等于 \(a\) 且不同的后缀最大值的个数等于 \(b\) 的排列的数目对 \(998244353\) 取模的结果 \(1\le n\le 10^5,0\le a,b\le n​\) Solution 画一画合法的排列可以分析得出以下信息 无论是前缀最大值还是后缀最大值,新出现的最大值 \(k​\) 总是会以 \(\{k,i_1,i_2,...,i_c\}​\) 的形式出现,其中 \(i_1,i_2,...,i_c​\) 为任意 \(c​\) 个小于 \(k​\) 的数, \(c​\) 可以为 \(0​\) 整个排列的最大值,即 \(n​\) ,会将这个序列分为前后两个排列,而这两个排列是独立的 由于我们只关注排列的相对大小关系,所以被处在下标 \(i​\) 位置的 \(n​\) 划分出的两个小排列可以直接看作 \(\{1,2,...,i-1\}​\) 与 \(\{1,2,...,n-i\}​\) 两组元素的排列 所以我们只需要求 \(1...i\) 的全排列中不同的前缀最大值的个数等于 \(s\) 的排列个数即可, \(i\in [0,n],s\in[1,n]\) 从第一条性质我们可以看出,如果我们将 \(n\) 个元素划分为 \(j\) 个集合,并默认其中的最大值为 \(k\) ,并按每个集合的

Project Euler Problem 675

别等时光非礼了梦想. 提交于 2019-11-29 13:51:23
ORZ foreverlasting 聚聚,QQ上问了他好久才会了这题 (所以我们又聊了好久的Gal) 我们先来尝试推导一下 \(S\) 的性质,我们利用 狄利克雷卷积 来推: \[2^\omega=I\ast|\mu|\] 这个很好理解吧,考虑一下它的组合意义即可 然后两边同卷上 \(I\) 有: \[2^\omega \ast I=I\ast I\ast |\mu|=d\ast |\mu|\] 后面还是同样,考虑 \(d\ast |\mu|\) 的组合意义,一正一反的情况下其实就是 \(d(n^2)\) 因此我们有了 \(2^\omega\ast I=d(n^2)\) ,即 \(S(n)=d(n^2)\) 那么显然 \(S\) 现在是个 积性函数 了,答案又是阶乘的形式,因此可以从 \(n-1\) 的答案推到 \(n\) 来 考虑一个非常暴力的过程,每次暴力分解质因数,复杂度大概是 \(O(n\sqrt n)\) 的 然后你只需要一台好一点的电脑 我仿佛已经闻到了CPU的香气 然后考虑怎么优化这个过程,我们发现类似于某个套路,这种方法之所以慢是因为会出现不必要的枚举,因此我们只需要记录一下每个数的 最小质因数 ,然后每次直接除去即可,顺带把贡献算一下 这样的复杂度很迷啊,加藤聚聚说是一个 \(\log\) 的,我感觉还要再少点,毕竟向下除至少去掉一个 \(2\)