
数论
文章平均质量分 63
克莉丝汀娜
此时一名自称平民的玩家路过
展开
-
343A(gcd)
有阻值为1欧姆的电阻。问最少使用多少个这样的电阻通过串并联得到阻值为a/b的电阻。1、若a%b==0,则只需a/b个电阻。否则2、若a>b,设k=a/b的整数部分。则可通过串联k个电阻,使问题转化为得到阻值(a-k*b)/b,即(a%b)/b3、若a具体处理时,对于第三种情况只需交换a、b的值即可转变为第二种情况。上述过程其实就是一个辗转相除的过程。修改一下欧几里得算法原创 2015-03-26 09:54:51 · 520 阅读 · 0 评论 -
hdu 5428 the factor(分解质因子)
给一个序列,设所有项乘积为a,求a的因子中因子个数大于2的最小因子。将每个数分解质因子,记录每个质因子的个数。然后从最小的质因子开始取(累乘),直到取够两个(因为1和其本身也是该数的因子),此时得到的结果就是满足条件的最小因子。#include#include#include#include#include#include#define INF 0x原创 2015-09-06 06:34:27 · 463 阅读 · 0 评论 -
hdu 5430 reflect (欧拉函数)
从一个圆上一点发射光线,问反射N次后恰好第一次回到起点的发射方案数。主要说一下为什么K/(N+1)需要是一个既约分数。设g=gcd(K,N+1),k=K/g,n=(N+1)/g,即有g*(2*θ*n)=g*(2*k*Pi),即相当于反射n-1次回到起点g次。这样,如果g!=1,是不符合题意的。关于欧拉函数#include using namespace s原创 2015-09-06 07:21:11 · 427 阅读 · 0 评论 -
sdut 3258 Square Number
给出一个序列,求其中乘积是平方数的数对个数。解法:将每个数的平方因子筛掉,得到新数,然后排序,统计相同的个数num,结果累加num*(num-1)./2就好了。#include#include#include#includeusing namespace std;int p[1000],cnt=0,a[100005];bool judge(int x){原创 2015-07-25 09:30:00 · 381 阅读 · 0 评论 -
CodeForces 490C Hacking Cypher
给一个数字串,和两个整数a,b。问能否将该串分成两部分,其前后两部分分别被这两个整数整除。解法:根据同余定理,从前往后扫一遍数字串,可以得到各个前缀模a的余数A[i]。再从后往前扫一遍,可以得到各个后缀模b的余数B[i]。然后再扫一遍每一个位置i,看是否有A[i]=B[i+1]=0。注意,由于不能有前缀0且拆分后得到的数必须大于0,因此在判定A[i]=B[i+1]=0的时候原创 2015-07-24 11:32:02 · 477 阅读 · 0 评论 -
hdu 5392 Infoplane in Tina Town (置换循环长度)
给一个置换,求循环长度,结果对3221225473取模。有一个莫名其妙的定理:点击打开链接根据该定理求最小公倍数就好了,用欧几里得算法求的话会TLE.将每个循环长度分解质因子再求就好了。坑点:模数用int是存不下的。#include#include#include#includeusing namespace std;#define maxn 30原创 2015-08-16 21:39:42 · 679 阅读 · 0 评论 -
hdu 5373 the shortest problem
根据同余定理,可得性质:奇偶位的和之差能被11整除,则该数能被11整除。用c++超时,用G++就过了,(╯°Д°)╯︵┴┴#include#include#include#include#include#include#include#include#include#include#include#pragma comment(linker,原创 2015-08-11 19:32:37 · 397 阅读 · 0 评论 -
sdut 3257 Cube Number
求乘积为立方数的数对个数。(不考虑数对中数的相对顺序)先筛掉每个原数中的立方因子得到新数,对于每一个新数,若存在平方因子,则需要找该平方因子为1的对应的数与其匹配;若不存在平方因子(即只含单个因子),则找含有两个该单因子的数与其匹配。注意,找到的匹配的数可能会超过1e^6,此时需要特判,并且用long long来存储,否则会RE。具体代码实现的时候,使用一个变量tem,原创 2015-07-25 11:48:56 · 693 阅读 · 0 评论 -
codeforces 546D Soldier and Traveling(求一个数的质因子个数)
题目本质就是:给出a,b,求a的阶乘的因子个数减去b的阶乘的因子个数。预先打表处理求出范围内的数的因子个数。再求一下前缀和,就得到了对应的数的阶乘的因子个数了。#includeusing namespace std;typedef long long LL;#define N 5000001int prim[N],cnt[N],tot,a[N];//a[i]原创 2015-06-23 20:53:44 · 534 阅读 · 0 评论 -
codeforces 548 Mike and Frog
给出x1、y1、x2、y2,m,h1,h2,a1,a2,问经过多少次迭代:h1=(h1*x1+y1)%m,h2=(h2*x2+y2)%m,使得h1=a1且h2=a2。若不能得到,输出-1.找到h1->a1需要的次数a,a1->a1的次数b,h2->a2的次数c,a2->a2的次数d。然后就是看是否存在x、y使得bx+a=cy+b直接模拟就好了。首先分别判断h1、h2经过不超过2m次迭代原创 2015-06-24 10:57:13 · 575 阅读 · 0 评论 -
hdu 3037 saving beans (lucas定理)
题目大意:求在n棵树保存不超过m个豆子的方法数,结果对p取模。 (n、m分析:由插板法,在n棵树保存i个豆子方案数为C(n+i-1,i)。不超过m个豆子,则方案数为C(n+0-1,0)+C(n+1-1,0)+……+C(n+m-1,m)。根据组合数性质:C(n,m)=C(n-1,m-1)+C(n-1,m),可将上式化简为C(n+m,m)即所求结果为C(n+m,m)考虑原创 2015-05-06 17:01:53 · 445 阅读 · 0 评论 -
hdu 5226 Tom and matrix
求∑x2i=x1∑y2j=y1ai,j mod p 其中ai,j=Cji。 p为素数将式子展开后应用组合数公式:C(n,m)=C(n-1,m-1)+C(n-1,m) 化简。然后用lucas定理求解即可。#include #include #include #include #include #include #include using names原创 2015-05-22 16:30:28 · 587 阅读 · 0 评论 -
mobius inversion
有关资料:定义及性质证明线性筛法相关题目:hdu 1695题目大意:求满足x属于区间[1,m]与y属于区间[1,n],且gcd(x,y)=k的数对(x,y)个数。(x,y)与(y,x)属于算作同一个数对。分析:问题与求x∈[1,m/k],y∈[1,n/k]且gcd(x,y)=1数对(x,y)个数等价。。设f(i)表示x∈[1,m/k]原创 2015-05-06 19:05:25 · 484 阅读 · 0 评论 -
hdu 5212 code
题目传送门法一:观察calc函数,其本质就是求sigma(x*(x-1)),x=gcd(a[i],a[j])。然后发现a[i]的范围不大,因此x的范围也不大。于是可以考虑数据范围内每个x对答案的贡献。枚举x,设f[i]表示gcd=i的数对个数。则累加f[i]*i*(i-1)即为结果。关键就是求f[i]。可以先计算出n个数中i的倍数有多少个,设为s。这s个数,任意两个数的gc原创 2015-05-06 22:37:11 · 410 阅读 · 0 评论 -
欧拉筛法求欧拉函数
#include#include#includeusing namespace std;#define N 100000005bool vis[N];int p[N], cnt, phi[N];int Euler(int n){ int i, j, k; phi[1] = 1; for (i = 2; i < n; ++i){ if (!vis[i]){ p[cn原创 2015-05-03 17:10:30 · 421 阅读 · 0 评论 -
hdu 4704 sum
题目大意:给出N(1分析:一开始还以为是求整数划分个数,很快发现不是的。比如N=4的时候,(1,1,2)和(1,2,1)应当作不同的方案。考虑将N部拆分成N个1,然后对这N个1用插板法进行划分。那么总的方案就是C(n-1,0)+C(n-1,1)+……+C(n-1,n-1)=2^(n-1)注意到这里的N非常大,而1e9+7为质数,因此可使用费马小定理降幂处理。对于原创 2015-05-02 12:17:32 · 109 阅读 · 0 评论 -
乘法逆元
乘法逆元定义:满足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)有转载 2015-04-05 23:17:25 · 942 阅读 · 0 评论 -
hdu 5446 Unknown Treasure (Lucas定理+CRT+快速乘)
题目大意:给k个素数pi,记M为其乘积。计算C(n,m)%M。1、令a[i]=C(n,m)%pi,可用Lucas定理进行计算。2、问题转化为求最小的x,使得x%pi=ai。根据CRT求解即可。3、注意在应用CRT的时候,中间结果会溢出,需要用到快速乘法。#include #include #include using namespace std;type原创 2015-09-14 11:53:42 · 445 阅读 · 0 评论