数论
文章平均质量分 58
你就是根号四
烟台大学菜鸟学生
中国科学院大学什么都研究不出的研究生
展开
-
乘法逆元
定义:满足a*k=1(mod p)的k值就是a关于p的乘法逆元。逆元存在的价值之一:当我们要求(a/b)mod p的值,且a很大,无法直接求得a/b的值时,我们就要用到乘法逆元。我们可以通过求b关于p的乘法逆元k,将a乘上k再模p,即(a*k)mod p。其结果与(a/b)mod p等价。证:(其实很简单。。。)根据b*k≡1 (mod p)有b*k=p*x+1。k原创 2016-10-22 12:21:21 · 551 阅读 · 0 评论 -
G - Tr A 矩阵快速幂
A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973。 Input数据的第一行是一个T,表示有T组数据。 每组数据的第一行有n(2 0,90,9,表示方阵A的内容。 Output对应每组数据,输出Tr(A^k)%9973。Sample Input22 21 00 13 999999991 2 34 5 67 8原创 2017-02-23 19:14:50 · 356 阅读 · 0 评论 -
Saving Beans (卢卡斯定理)
题意:在n棵树上摘不超过m个豆子的方案数考虑多加一棵树,这样的话多加的那棵树摘了k个豆子时,原本n棵树上的豆子数量之和就等于m-k,满足题目要求,也降低了计算的难度。则题目要求a1+a2+a3+a4........an+an+1=m; 解有多少组考虑把问题转换成,求a1+a2+......an+an+1=m+n+1; 解有多少组一式每个ai都加一就是二式对于二式求解:原创 2016-11-02 20:23:10 · 569 阅读 · 0 评论 -
A/B(逆元)
逆元定义:对于正整数和,如果有,那么把这个同余方程中的最小正整数解叫做模的逆元。一般用欧几里得扩展来做:ax+by=1;称a和b互为逆元详细扩展欧几里德算法介绍,解决该题的关键是:1、了解扩展欧几里德算法,可以运用其解出gcd(a,b)=ax1+by1中的x1、y1的值2、由题可得以下内容:n=A%9973,则n=A-A/9973*9973。又A/B=x,则原创 2016-10-17 21:29:46 · 2144 阅读 · 0 评论 -
Reduced ID Numbers (同余)
题意:给出几个数 ,寻找一个最小数使这几个数mod它的值不相同解析:暴力枚举从1开始,将模完的数保存在一个数组里,如果遇到相同的值,就增大值继续枚举。直到寻找到。此处使用了mod[]数组,将模完的结果作为mod[]的下标,这样如果出现相同的值比较好发现(类比Find a multiple(鸽巢原理))此处应注意超时#include#include#includeusing n原创 2016-11-08 19:31:25 · 438 阅读 · 0 评论 -
辗转相除法(欧几里得算法)
1.普通辗转相除法求最大公约数int gcd(int a,int b){ if(b==0) return a; return gcd(b,a%b);}2.扩展欧几里得算法求整数x和y使得ax+by=1可以发现如果gcd(a,b)!=1;无解如果gcd(a,b)==1,就可以用扩展欧几里得算法来求解:即ax+by=gcd(a,b),设int extgcd(int原创 2016-10-18 10:59:52 · 896 阅读 · 1 评论 -
青蛙的约会 (同余)
题意:两只青蛙在同一纬度上(就是圆圈上)不同位置,具有不同的速度,看几次能跳的一起解析:设经过t次调到一起,(x+m*t)mod L=(y+n*t) mod L上式整理一下 (x+m*t)-(y+n*t)=p*L;(p是两只青蛙跳的圈数之差)转化一下:t*(m-n)+p*L=x-y;令a=n-m,b=L,c=gcd(a,b),d=x-y;有a*t+b*p=d;(1)要求的原创 2016-11-07 20:34:42 · 441 阅读 · 0 评论 -
All X(快速幂 + 循环节)
mod(k)x*(10^m-1)/9==c =x*10^m==9*c+x mod(k)巧妙的运用 111111=1*(10^6-1)/9#include#includeusing namespace std;long long m,x,t,c,k;long long mod_pow(long long a,long long b,long long c){原创 2016-10-15 14:09:50 · 453 阅读 · 0 评论 -
Find a multiple (鸽巢原理)
题意:给你n个数,从中选取m个数的和是n的倍数,(只输出一个就可以)解析:ps:鸽巢原理:n+1的物体放到n个盒子里,至少有一个盒子放了两个物体。Sk表示a1+a2+……ak,如果Sk是n的倍数,那就直接取Sk了,否则S1-Sn除n的余数分布在1---(n-1)这n-1个数中,运用鸽巢原理,必然有两个的余数相同,即(Si%n)=(Sj%n),即(Sj-Si)%n=0,证毕。原创 2016-11-05 18:21:34 · 679 阅读 · 0 评论 -
Count the Buildings (Stirling数)
题意:n个建筑高度为1-n,从前能看到f个,从后能看到b个,求可能有多少张排序情况解析:最高建筑n是一定可以看到的,固定住最高建筑n号楼的位置,将n号楼左边分为f-1组,右边b-1组,且用每组的最高元素代表这一组。而后发现n号楼的左边,组与组之间的元素一定是单调递增的!且每组中最高元素一定排在该组的最左边,每组的其他元素任意排列(相当于这个组中所有元素的环排列,所谓环排列就是一个元素位置固原创 2016-11-04 21:23:21 · 359 阅读 · 0 评论 -
快速幂取模
所谓的快速幂,实际上是快速幂取模的缩写,简单的说,就是快速的求一个幂式的模(余)。在程序设计过程中,经常要去求一些大数对于某个数的余数,为了得到更快、计算范围更大的算法,产生了快速幂取模算法。我们先从简单的例子入手:求abmodc算法一:int ans = 1;for(int i = 1;i<=b;i++){ ans = ans * a;}ans = ans % c;直接转载 2016-10-12 16:54:53 · 420 阅读 · 0 评论 -
2016"百度之星" - 资格赛(Astar Round1)Problem A (乘法逆元)
此题为逆元的应用,直接求的话会超时大体题意:给你个字符串并且告诉你n个查询。每个查询 有起点和终点,求从起点x到终点y (ASCII码-28)乘积之和对mod 取模的结果!很明显 肯定要先预处理使得sum[i]表示从第一个点到第i个点的乘积之和!然后通过sum[y]/ sum[x-1] 就是答案!但是要通过乘法逆元来得到!就是sum[y]乘以 s转载 2016-10-21 20:30:32 · 393 阅读 · 0 评论 -
Power of Cryptography
题意:给出两个数一个n,一个p,求k。满足k^n==p解题技巧:(q^(1/n)^n==qk==(q^(1/n);#include #include #include #include using namespace std;double a,b,x;int main(){ while(~scanf("%lf%lf",&a,&b)) {原创 2017-03-16 19:12:18 · 228 阅读 · 0 评论