随笔分类 -  数论

POJ 1006 中国剩余定理
摘要:1 #include 2 int main() 3 { 4 // freopen("in.txt","r",stdin); 5 int p,e,i,d,kase=0; 6 while(scanf("%d%d%d%d",&p,&e,&i,&d)) 7 { 8 if(p==-1 && e == -1 && i == -1 && d== -1) break; 9 const int m1 = 23,m2 = 28,m3 = 33;10 const int M1 阅读全文

posted @ 2013-10-16 21:32 allh123 阅读(243) 评论(0) 推荐(0)

rabin 素性检验 随机化算法
摘要:1 #include 2 #include 3 #include 4 typedef long long int LL; 5 inline bool qpow(int a,int x) 6 { 7 int b = x-1,ans = 1; 8 while(b) 9 {10 if(b&1) ans = (LL)ans*a%x;11 a = (LL)a*a%x;12 b >>= 1;13 }14 if(ans == 1) return true;15 else return false;16 }... 阅读全文

posted @ 2013-09-08 21:54 allh123 阅读(261) 评论(0) 推荐(0)

HDU 4471 矩阵快速幂 Homework
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4471解题思路,矩阵快速幂····特殊点特殊处理·····令h为计算某个数最多须知前h个数,于是写出方程:D =c1c2```c[h-1]c[h]10```0001```0000000010V[x] =f[x]f[x-1]``f[x-h+1]显然有V[x+1] = D*V[x].D是由系数行向量,一个(h-1)*(h-1)的单位矩阵,和一个(h-1)*1的0矩阵组成。V[x]是一个h行,1列的矩阵。初始条件为V 阅读全文

posted @ 2013-09-02 12:40 allh123 阅读(350) 评论(0) 推荐(0)

POJ 3233 Matrix Power Series 矩阵快速幂
摘要:设S[k] = A + A^2 +````+A^k.设矩阵T =A[1]0EE这里的E为n*n单位方阵,0为n*n方阵令A[k] = A ^ k矩阵B[k] =A[k+1]S[k]则有递推式B[K] = T*B[k-1],即有B[k] = T^k*B[0],令S[0] 为n*n的0矩阵。矩阵快速幂求出即可·····还可以使用两次分治的方法····自行百度····贴代码: 1 #include 2 #include 3 int n,k,p,d;//d = 2*n 4 阅读全文

posted @ 2013-08-27 13:55 allh123 阅读(214) 评论(0) 推荐(0)

HDU 4686 矩阵快速幂 Arc of Dream
摘要:由式子的性质发现都是线性的,考虑构造矩阵,先有式子,a[i] = ax * a[i-1] + ay; b[i] = bx*b[i-1] +by;a[i]*b[i] = ax*bx*a[i-1]*b[i-1] + ax*by*a[i-1] + bx*ay*b[i-1]+ay*by;s[i] = s[i-1] + a[i-1]*b[i-1];由此得到递推式 :设矩阵A=ax000ay0bx00byax*bybx*ayax*bx0ay*by0011000001矩阵B[i]=(a[i-1],b[i-1],a[i-1]*b[i-1],s[i-1],1)' (转置),B[i] =(a[i],b[i 阅读全文

posted @ 2013-08-27 12:16 allh123 阅读(230) 评论(0) 推荐(0)

HDU 4599 概率DP
摘要:先推出F(n)的公式:设dp[i]为已经投出连续i个相同的点数平均还要都多少次才能到达目标状态。则有递推式dp[i] = 1/6*(1+dp[i+1]) + 5/6*(1+dp[1]).考虑当前这一次掷色子,有1/ 6的概率投的和前面的一样,有5/6的概率不一样,不一样就要重新投,就到了dp[1]的状态,这里投了一次,所以要加1.边界有dp[0] = dp[1]+1,dp[n] = 0;可以这么说,H[n]应该是6*F[n]的,随便YY一样。更严谨的话就是一样要去推,递推式如下,设dp[i]为已经连续i次投出1后平均还要多少次才能达到目标状态。有递推式dp[i] = 1/6*(dp[i+1]+ 阅读全文

posted @ 2013-08-25 17:40 allh123 阅读(832) 评论(0) 推荐(0)

HDU 4497 数论+组合数学
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4497解题思路:将满足条件的一组x,z,y都除以G,得到x‘,y',z',满足条件gcd(x',y',x') = 1,同时lcm(x',y',x') = G/L.特判,当G%L != 0 时,无解。然后素数分解G/L,假设G/L = p1^t1 * p2^t2 *````* pn^tn。满足上面条件的x,y,z一定为这样的形式。x' = p1^i1 * p2^i2 *```* pn^in.y' = p1^j1 * p2^ 阅读全文

posted @ 2013-08-24 19:59 allh123 阅读(877) 评论(0) 推荐(0)

HDU 4662 MU Puzzle 数论或者水题
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4662题目是问目标串能否由MI得到,我们可以逆向思维,目标串能否反过来处理得到MI,所以,首先排除M没有出现或者出现超过一次,或者只出现了一次但没有出现在第一个位置的情形····也就是说只剩下第一个位置是M,然后不再出现M的情形····接下来思考如何得到I,既然要得到I,U必然要化成I,一个U相当于3个I,接下来还可以每次添加UU,相当于添加了6个I,这样当I的个数能凑成2^k,k>=0时,就是解问题转化为如下:关 阅读全文

posted @ 2013-08-10 18:52 allh123 阅读(390) 评论(0) 推荐(0)

HDU 4651 数论 partition 求自然数的拆分数
摘要:别人的解题报告:http://blog.csdn.net/zstu_zlj/article/details/9796087我的代码: 1 #include 2 #define N 100020 3 const int mod = 1e9+7; 4 int p[N]; 5 void Partition() 6 { 7 p[0] =1; 8 for(int n=1; n = 0)18 p[n] = (p[n]+fac*p[t-k])%mod;19 p[n] %= mod;20 fac = -fac;2... 阅读全文

posted @ 2013-08-07 13:56 allh123 阅读(290) 评论(0) 推荐(0)

线性筛法打素数表 可以做模板
摘要:如果想了解详情,请点击下面链接:http://blog.sina.com.cn/s/blog_787c1f7b0100s0yx.html我的代码: 1 #include 2 #define N 5000005 3 bool v[N]; 4 int prime[N]; 5 int main() 6 { 7 int num=-1; 8 for(int i=2; i<N; ++i) 9 {10 if(!v[i]) prime[++num] = i;11 for(int j=0; j<=num && i*prime[j] < N; ++j)12... 阅读全文

posted @ 2013-08-03 14:57 allh123 阅读(267) 评论(1) 推荐(0)

Zoj 3529 A Game Between Alice and Bob 数论+博弈Nim 快速求数中有多少个素数因子
摘要:本题涉及博弈论中的Nim游戏博弈。Nim游戏博弈详解链接:http://www.cnblogs.com/exponent/articles/2141477.html本题解题报告详解链接:http://blog.csdn.net/woshi250hua/article/details/7824609我的代码,写的较挫,4000多ms,压着时间过,时间限制是5s.我预处理了所有1-5*10^6的数的素因子个数,用的是dp的思想,先预处理1-5*10^6的数的最小素因子,存在a数组中,然后dp[i] = dp[i/a[i] ]+1;我觉得我代码最挫的地方是在求最小素因子时费时太多。。。。 1 #in 阅读全文

posted @ 2013-08-03 10:23 allh123 阅读(269) 评论(0) 推荐(0)

HDU 1271 整数对
摘要:这个题算是数论类吧,也许也就是水题级别,不过我估计是很难想出来的````首先你自己拿个数试一下比较好看出来规律。比如 A = 3457拿掉数字5B = 347把A写成34*10^2+5*10^1+7B写成34*10+7更一般地,如果拿掉的是第k位数字(0<=k<=log10(N)),A = a*10^(k+1)+b*10^k+c.(其中a为数字b之前的数,c为数字b之后的数)然后B = a*10^k+c有方程A+B=N,带入,得11*10^k*a+10^k*b+2*c = N,10^k*b<=9*10^k,2*c<2*10^k ,所以有10^k*b+2*c < 1 阅读全文

posted @ 2013-04-26 00:34 allh123 阅读(123) 评论(0) 推荐(0)

求最小公倍数与最大公约数的函数
摘要:求整数a,b的最大公约数和最小公倍数先求最大公约数,辗转相除:int gcd(int a,int b){return (b == 0)? a:gcd(b,a%b);}求出最大公约数后,利用a*b = lcm(a,b)*gcd(a,b)求最小公倍数int lcm(int a,int b){ return a/gcd(a,b)*b;} 阅读全文

posted @ 2013-03-13 21:26 allh123 阅读(362) 评论(0) 推荐(0)

导航