数学
TommyTT
我擦,要挂科了。
展开
-
uva 11021 Tribles
#include#include#include#includeusing namespace std;double p[1005];double f[1005];/*f[i]=p[0]+p[1]*f[i-1]+p[2]*f[i-1]^2+p[3]*f[i-1]^3……*//*f[i]为一个毛球i天死光的概率*/int main(){ int t,n,m,k;原创 2013-07-13 17:41:25 · 650 阅读 · 0 评论 -
poj 2992 Divisors 整数分解
设m=C(n,k)=n!/((n-k)!*k!) 问题:求m的因数的个数将m分解质因数得到p1有a1个p2有a2个....由于每个质因数可以取0~ai个(全部取0就是1,全部取ai就是m)最后的答案就是(a1+1)*(a2+1)*....*注意不能直接将m分解,因为太大,所以要先分解n,n-k,k,根据他们再来加减。#include #include #includ原创 2014-07-02 10:57:54 · 827 阅读 · 0 评论 -
poj 3090 Visible Lattice Points 法雷级数||打表
由于图像关于对角线对称,所以我们只看下三角区域。将x轴看做分母,被圈的点看成分子依次是{1/2},{1/3,1/2},{1/4,3/4},{1/5,2/5,3/5,4/5}写成前缀和的形式就是 {1/2},{1/2,1/3,2/3},{1/2,1/3,1/3,1/4,3/4},{1/2,1/3,1/3,1/4,3/4,1/5,2/5,3/5,4/5}发现,这就是一个法雷级数,即第k项增原创 2014-07-02 09:14:24 · 876 阅读 · 0 评论 -
poj 2409 Let it Bead Polya计数
旋转可以分为n种置换,对应的不同等价类分别是gcd(n,i)个i=0时不动,有n个翻转分为奇偶讨论,奇数时有n种置换,每种有n/2+1个偶数时有n种置换,一半是n/2+1个,一半是n/2个#include #include #include #include#include#includeusing namespace std;typedef long long ll;原创 2014-07-05 20:59:44 · 757 阅读 · 0 评论 -
poj 2154 Color 欧拉函数优化的ploya计数
枚举位移肯定超时,对于一个位移i,我们需要的是它的循环个数,也就是gcd(i,n),gcd(i,n)个数肯定不会很多,因为等价于n的约数的个数。所以我们枚举n的约数,对于一个约数k,也就是循环个数为n/k这样的个数有phi[k]种,证明网上有很多。所以答案就是 phi[k]*(pow(n,n/k)) (k是n的所有约数)由于约数会很大所以不能打表,只能单个算。再由于最后要除以n,如果做原创 2014-07-06 16:12:12 · 791 阅读 · 0 评论 -
hdu 1812 Count the Tetris polya计数
哈哈哈,简单polya,公式自己推导。不过这题需要用到大数,很久没写Java,调了好久。import java.math.*;import java.util.*;import java.io.*;public class Main{ public static void main(String args[]){ Scanner cin=new Scanner(Syst原创 2014-07-06 10:04:56 · 1276 阅读 · 0 评论 -
poj 3735 Training little cats 矩阵
假设n=3构造矩阵【1,0,0,0】对于g 1操作,构造矩阵(0行i列++)1 1 0 00 1 0 00 0 1 00 0 0 1对于e 1操作,构造矩阵 (i整列清空)1 0 0 00 0 0 00 0 1 00 0 0 1对于s 1 2操作,构造矩阵 (i,j整列交换)1 0 0 00 0 1 00 1 0 00 0原创 2014-07-09 10:19:51 · 636 阅读 · 1 评论 -
poj 3478 The Stable Marriage Problem 稳定婚姻问题
真有意思,题目给出n个男的和n个女的各自喜欢对方的程度,让你输出一个最佳搭配,使得他们所有人的婚姻都是稳定的。所谓不稳婚姻是说,比如说有两对夫妇M1,F1和M2,F2,M1的老婆是F1,但他更爱F2;而F2的老公虽说是M2.但她更爱M1,这样的婚姻就是不稳婚姻,M1和F2理应结合,他们现在各自的婚姻都是错误的。整个算法基于,男性轮流向女性求婚,每次求婚对象都是没有拒绝过自己且自己最喜欢原创 2014-07-08 14:56:02 · 1377 阅读 · 0 评论 -
poj 2356 Find a multiple 鸽巢原理的简单应用
题目要求任选几个自然数,使得他们的和是n的倍数。由鸽巢原理如果我们只选连续的数,一定能得到解。首先预处理前缀和模n下的sum,如果发现sum[i]==sum[j] 那么(sum[j]-sum[i])%n一定为0,直接输出i+1~j就够了。为什么一定会有解,因为sum从1~n有n个数,而模n下的数只有0~n-1,把n个数放入0~n-1个数里,怎么也会有重复,所以这种构造方法一定没问题。原创 2014-07-08 08:57:58 · 819 阅读 · 0 评论 -
FZU - 1759 Super A^B mod C 降幂公式
知道降幂公式这题就很好办了 B>=Phi(c)的时候可以降幂然后快速幂计算,否则就直接快速幂计算。这里的大数对小数取模直接利用取模性质按位取就行了。//A^B %C=A^( B%phi(C)+phi(C) ) %C#include #include #include #include #include#includeusing namespace std;typedef _原创 2014-07-09 12:37:18 · 1651 阅读 · 0 评论 -
poj 2429 Pollard_rho大数分解
先对lcm/gcd进行分解,问题转变为从因子中选出一些数相乘,剩下的数也相乘,要求和最小。这里可以直接搜索,注意一个问题,由于相同因子不能分配给两边(会改变gcd)所以可以将相同因子合并,这样的话,搜索的层数也变的很少了。#include#include#include#include#include#include#includeusing namespace std;t原创 2014-08-09 20:29:33 · 852 阅读 · 0 评论 -
uva 10780 Again Prime? No Time. 质因子乱搞
求最大的k 使得 m^k 能被n!整除m^k就是让m的每个质因子个数增加了k倍,只要求得n!的质因子能让m增加多少倍就够了。当然这里要取增加倍数最少的。木桶装水的量取决于最短的木板。预处理2-n每个数的质因子情况,由于n有10000,前10000个素数有1000+个,所以维护前缀和不划算。case只有500 所以干脆每次都算一遍。#include#include#inc原创 2014-08-13 16:13:09 · 726 阅读 · 0 评论 -
置换群
假设初始状态为 a:2 3 1 5 4 6则目标状态为b:1 2 3 4 5 6且下标为初始状态中的3 1 2 4 5 6(a[3],a[1]...)将置换群写成循环的形式(2,3,1),(5,4),6就不用移动了。移动方式2种1:选循环内最小的数和其他len-1个数交换2:选整个序列最小的数和循环内最小的数交换,转到1,再换回来。#include#inclu原创 2014-07-01 10:06:34 · 1497 阅读 · 0 评论 -
poj 1830 开关问题 高斯消元
a1 a2 a3 1号灯a1 a2 a3 2号灯a1 a2 a3 3号灯假设按2的时候影响1那么就是第一行第二列为1,意思就是通过2号灯的变化可以影响1号灯再有第i行第i列也为1,意思就是通过i号灯的变化可以影响i号灯高斯消元求解方程,会得到r个解,剩下的n-r就是自由变元,其实意思就是可以随便取,比如0*x=0,那么x就是自由的了。原创 2014-06-06 21:12:17 · 966 阅读 · 4 评论 -
hdu 1575 Tr A
矩阵裸体#include #include #include #include using namespace std;#define MOD 9973#define MN 10#define MM 10int N;struct matrix{ int a[MN][MM];}origin,res,ans;matrix multiply(matrix &x,原创 2013-08-09 16:44:57 · 607 阅读 · 0 评论 -
poj 3070 Fibonacci
矩阵好神奇~~#include #include using namespace std;#define MOD 10000#define MN 10#define MM 10int N;struct matrix{ int a[MN][MM];}origin,res,ans;matrix multiply(matrix &x,matrix &y){原创 2013-08-11 08:28:12 · 690 阅读 · 0 评论 -
hdu 4486 Pen Counts 数学
枚举最大边,其他的找规律。注:O(n)算法才不会超时#include#include#include#includeusing namespace std;int main(){ int cas; scanf("%d",&cas); while(cas--) { int id,n,tot=0; scanf("%d原创 2013-08-12 17:03:15 · 827 阅读 · 0 评论 -
hdu 4565 公式推导+矩阵快速幂
hdu 4565 公式推导+矩阵快速幂原创 2013-08-16 10:11:47 · 860 阅读 · 0 评论 -
hdu 4627 水数学题
最小公倍数最大,也就是尽量让2个数互质,所以把n除以2 从中间向两边找就够了,自己写几组数据就能发现规律。注意longlong存#include#include#include#includeusing namespace std;int main(){ int cas; long long s,n; cin>>cas; while(cas-原创 2013-09-19 21:32:10 · 764 阅读 · 0 评论 -
LightOJ 1104 Birthday Paradox 概率(生日悖论)
参考百科:挺有意思的 生日悖论相信那条曲线的上升速度,100000个人的时候,只需要300+就能找到概率0.5的位置。srick:1个人的时候,答案不是0,而是1。【尼玛坑爹啊,总共才1个人,怎么找出2个人生日一样啊,草草草!害我WA半天】。#include#include#include#includeusing namespace std;int up,d原创 2014-01-28 21:33:38 · 1160 阅读 · 0 评论 -
hdu 1796 How many integers can you find 容斥原理
abc=a+b+c-ab-ac-bc+abcabcd=a+b+c+d-ab-ac-ad-bc-bd-cd+abc+abd+bcd-abcd...dfs枚举,传参保证当前是加还是减,注意输入检查以及#include #include #include #include using namespace std;typedef long long ll;ll t[20原创 2014-04-17 14:09:28 · 556 阅读 · 0 评论 -
poj 1061 扩展欧几里得求解同余方程
总结都写在了注释里。#includeusing namespace std;long long exgcd(long long a,long long b,long long &k,long long &t){ if (b==0) { k=1; t=0; return a; } else {原创 2014-04-23 01:25:52 · 885 阅读 · 0 评论 -
poj 1091 跳蚤 扩展欧几里得性质+容斥原理
原问题可以转换为求 x(1)*a(1)+x(2)*a(2)+....x(n+1)*a(n+1)=1 的x(i)的所有组合【其中x(n+1)=M】若gcd (x1,x2,x3....M)=1,则我们知道此式一定有解,即我们要求一组x,使得它们和M的最大公约数为1,从反面考虑,我们可用总数减去最大公约数不为1的。即x(1~n)与M存在公因子,至此容斥的思想就出现了。解:求出M的所有原创 2014-04-23 14:52:47 · 776 阅读 · 0 评论 -
poj 2142 The Balance 扩展欧几里得
首先求出通项 X=x+b/d*t Y=y-a/d*t (x,y为ax+by=gcd(a,b)的解,d=gcd(a,b))可知我们要求的最小的解是 abs(x+b/d*t) + abs(y-a/d*t)设a>b不是的话,就交换a,b,我们发现上述关于t的方程是 |x+k1*t| + |y-k2*t|,由于a>b所以k2>k1,所以方程一开始右边减小的比左边增加的快所以当y=k2*t的时候原创 2014-06-28 18:02:31 · 704 阅读 · 0 评论 -
poj 2369 Permutations 置换水题
找循环节求lcm就够了,若答案是12345应该输出1,被坑了下。#include#include#include#include#include#includeusing namespace std;#define INF 0x3FFFFFF#define MAXN 2222#define eps 1e-6int a[MAXN],p[MAXN],b[MAXN],vis[MA原创 2014-07-20 16:26:24 · 836 阅读 · 0 评论 -
hdu 4407 Sum 容斥+离线
求X-Y之间和p互质的数的和,典型的容斥问题,求和用等差数列求和,注意首项末项是多少。首先记录下不修改的答案,离线处理,存下询问,输出的时候,遇到一个操作1,就遍历前面的操作,把修改加上去,注意要判重,只保留最后一次修改。#include #include #include #include #include #includeusing namespace std;typed原创 2014-09-30 00:06:29 · 922 阅读 · 0 评论