随笔分类 - 数学类题目
摘要:题目:http://acm.hdu.edu.cn/showproblem.php?pid=1027给出 n m ,求对于 n 的全排列里第 m 小的,可以直接用dfs,因为m 最大是 10000,最多变换后面的8位就可以了,也可以直接用库函数里的全排列函数,先求出第m 小的全排列需要变换的最少的个数,然后对于最后面的几个数进行排列,前面的不用动View Code 1 typedef long long ll; 2 int n,num; 3 int mark[9]; 4 ll tsum; 5 int main() 6 { 7 int n,m; 8 int i,j; 9 ...
阅读全文
摘要:题目:http://poj.org/problem?id=1183前面给了好长的一段描述,最后面的那个公式是关键:arctan(p)+arctan(q)=arctan[(p+q)/(1-pq)],然后题目是给出 a 求 (b + c)满足:arctan(1/a)=arctan(1/b)+arctan(1/c) ,根据掐面的公式可以化简得 : a = (b * c - 1) / (b + c)。令 b = (a + m) c = (a + n)然后代入化简得 m * n = a ^ 2 + 1;所以枚举 m 或 n 然后求出另一个就行了View Code 1 int main() 2 { 3..
阅读全文
摘要:题目:http://poj.org/problem?id=2348题意:给出两个数 n 和 m,两个人轮流操作,每次用上一次的结果中大的减去小的 x 倍(当然得到的数不能为负数),这样直到某个人无法操作时,即为输者,求谁是必胜者从网上看的一个思路:对于任意的两个数 比如说是 25 7 ,可以拿走 1 * 7个 , 2 * 7个 3 * 7个,每次拿走的是 7 * i 个,如果 i < 3, 那么对于下一个人,他还是的 拿 7 * j (j > 0 && j < 3 - i)个,也就是说必须把 这 3 * 7 个都拿完(4,7),才可以 开始 4个 4个的拿,也
阅读全文
摘要:题目:http://poj.org/problem?id=2142给出 a b d,找出 x 和 y 能够组合出 d,也就是满足 a * x + b * y = d,a 和 b 不一定是在天枰的同一边,利用扩展欧几里得求出 x , y, x,y可能为负值,把 x y 转化为最小的正整数,然后利用 最小的 x ,根据 ty = (d - a * x) / b,和最小的 y 根据 tx = (d - b * y) / a,判断 x + ty 和 y + tx的大小,然后输出结果View Code 1 typedef long long ll; 2 int exgcd(int a,int b,in.
阅读全文
摘要:题目:http://poj.org/problem?id=1730给出 x 求出最大的p 满足 x = b ^ p;因为p 最大是 32,所以枚举 p,如果一个数本身是素数,那么一定输出 1,注意如果 x < 0时,p 不可能是 偶数View Code 1 typedef long long ll; 2 bool isprime(ll a) 3 { 4 ll i; 5 for(i = 2; i * i <= a; i++) 6 { 7 if(a % i == 0) return false; 8 } 9 return true;10 }...
阅读全文
摘要:题目:http://poj.org/problem?id=1665http://poj.org/problem?id=16661665 :读清题意,这个题目也就是几行代码。题目里给的那个 n 是转的圈数,而不是转速,注意单位间的换算1666:纯粹的一个模拟,数据n开到了10000,具体多少好像题目没说View Code 1 const int N = 10000; 2 int cand[N]; 3 int main() 4 { 5 int i,j; 6 int n; 7 while(~scanf("%d",&n)) 8 { 9 if(n == ...
阅读全文
摘要:题目:http://poj.org/problem?id=1565刷水题刷的都鄙视自己了View Code 1 typedef long long ll; 2 char str[40]; 3 ll mypow(int len) 4 { 5 int i; 6 ll temp = 1; 7 for(i = 0; i < len; i++) 8 temp *= 2; 9 return temp;10 }11 int main()12 {13 int i,len;14 while(~scanf("%s",str))15 {16 ...
阅读全文
摘要:题目:http://poj.org/problem?id=1306求C(n,m),n m 最大为100,任何一个数都可以表示成 质因子的幂的乘积 x = p1 ^ a1 * p2 ^ a2 ~~~pn ^ an,这样对 C(n,m) = n! / ((n - m)! * m!),对 分别对 n,m,(n - m)分解质因子,然后用质因子的幂数想减,最后得到的(p1 ^ sum1 * p2 ^ sum2 ~~~pn ^ sumn),就为结果。View Code 1 typedef long long ll; 2 const int N = 101; 3 int prime[N]; 4 bool.
阅读全文
摘要:题目:http://poj.org/problem?id=1305题意:从 1 到 n 中找出 x y z 三个数满足:x ^ 2 + y ^ 2 = z ^ 2,且(x < y < z, x y z 两两互质)这些条件的(x,y,z)共有多少个,第二, 在 1到 n 中不是 x,y,z任意一个或两个或三个的整数倍的数有多少很暴力的方法,枚举 x y,然后判断zView Code typedef long long ll;bool mark[1000001];int gcd(int a,int b){ if(!b) return a; else return gcd(b,a % b
阅读全文
摘要:题目:http://poj.org/problem?id=1091按照我想的应该用高精度写的,写高精度求幂,和加减运算,但是题目数据不强,long long也过了,就懒得写高精度了,题意是:找出 n + 1 个数( <= m ) 这(n + 1)个数最大公倍数是 1,首先求出 m 的所有质因子,然后用这些质因子构成 (n + 1)个数最大公倍数不是 1的情况,最后用总数减去这些情况View Code 1 typedef long long ll; 2 const int N = 20001; 3 bool vis[N]; 4 int prime[N]; 5 int num,tnum; 6
阅读全文
摘要:题目:http://poj.org/problem?id=1142如果一个数本身是素数,那么这个数不是Smith Numbers,如果一个数不是素数,那么10 ^ 4( n 最多 8 位)以内一定有它的质因子,打出10000以内的素数,分解求和,从 n + 1往后枚举View Code 1 const int N = 10001; 2 int prime[N]; 3 bool vis[N]; 4 int num,tnum; 5 void is_prime() 6 { 7 int i,j; 8 num = 0; 9 for(i = 2; i <= N; i++)10 ...
阅读全文
摘要:题目:http://acm.timus.ru/problem.aspx?space=1&num=1132很无奈的一个题,看解题报告没看懂怎么回事,问的队友,然后不知道他怎么找的那些资料,然后我就是直接看的链接,http://en.wikipedia.org/wiki/Tonelli%E2%80%93Shanks_algorithm再加上 n == 2时特判,然后就是 r == n - r 时,输出一个,然后就是按照那个算法步骤算了View Code 1 typedef long long ll; 2 ll tmod; 3 ll mod(ll n,ll p) 4 { 5 ll temp.
阅读全文
摘要:题目:http://acm.timus.ru/problem.aspx?space=1&num=1286题目要求 p * x1 + q * y1 = abs(ex - sx) && p * x2 + q * y2 = abs(ey - sy)同时成立,设 d = gcd(p,q) ,dx = abs(ex - sx), dy = (ey - sy),如果 (dx % d || dy % d )成立,那么从开始点一定到不了终点,否则 dx /= d, dy /= d, p /= d, q /= d;分情况讨论,详见此出http://shaidaima.com/source
阅读全文
摘要:题目:http://acm.timus.ru/problem.aspx?space=1&num=1430题意很简单,第一感觉是枚举,但是看了一下数据范围,直接没有写,然后感觉 a * x + b * y = n - (某个数)这个方程有解,像是扩展欧几里德,写了之后没过样例。后来还是写了枚举,但是就是超时,网上找了一下,少了一个优化,但是优化的还没看懂,还是HG给讲的才看懂了View Code 1 int main() 2 { 3 ll a,b,n; 4 int x,y; 5 int i; 6 while(cin>>a>>b>>n) 7 { 8 ..
阅读全文
摘要:题目:http://acm.hdu.edu.cn/showproblem.php?pid=1695给出a b c d k 在 [a,b] [c,d]内各找一个数,使得gcd(x,y) == k,也就是说 gcd(x / k, y / k) == 1,所以就是在 [1,b / k] [1, d / k]中找互质的对数。容斥原理和欧拉函数的应用,首先在打印素数的同时求出每个数的欧拉函数值,对于[1,b]内的数直接用欧拉数组求互质的对数,对于[b + 1,d]的数用容斥原理求互质对数,首先求出不互质的对数,然后用总的减去不互质的对数。比如说某个数 n ,首先求出 n 的所有因子num, 假设单个因子
阅读全文
摘要:题目:http://acm.timus.ru/problem.aspx?space=1&num=1091题意:从 s 个数里挑出 k 个, 这个 k 个数的共因子大于 1 一共有多少种方法直接暴搜,注意剪枝优化View Code 1 typedef long long ll; 2 const int N = 60; 3 int ans,k,s; 4 bool vis[N]; 5 int flag; 6 int gcd(int a,int b) 7 { 8 if(!b) return a; 9 else return gcd(b,a % b);10 }11 bool juge(...
阅读全文
摘要:题目:http://acm.timus.ru/problem.aspx?space=1&num=1748题意:定义:一个数的的因子个数称为该数的复杂度,给出一个n,求从 1 ~ n 范围内复杂度最大的数,如果有多个相等,输出最小的,并输出因子个数其实就是求反素数的(关于反素数:http://www.cnblogs.com/fxh19911107/archive/2012/07/28/2613150.html),先用求反素数的模板求出在n 范围内复杂度最大的数,然后再把 这个数分解成 素数 乘积的形式,求出因子数View Code 1 typedef long long ll; 2 co
阅读全文
摘要:题目:http://acm.hrbeu.edu.cn/index.php?act=problem&id=1010&cid=25题目不难,但是当 a b c都很大时,就不知道怎么算了,当作一个 求 c (n, m) % p的模板用吧。参考链接:http://www.cnblogs.com/gxceo/archive/2011/04/04/2005137.html因为任何一个实数都可以写成 素数的乘积的形式,所以 c (n , m) = n ! / ( m! * (n - m) !) 就可以把这几个数都写成数素的乘积,然后分子分母低数相同的素数的指数进行相减,然后,剩余的数对 c
阅读全文
摘要:题目:http://acm.timus.ru/problem.aspx?space=1&num=1355题意:给出两个数 a b,从a 可以走的编号是 b 的因子,每走一个编号就可以喝一杯酒,问从 a 到 b 可以喝到最多的酒是多少(大概是这个意思)思路:如果从a 到不了 b(即 b % a 不为零) 那么 ans = 0;如果可以走到,那么计算 b / a 后的素因子的个数View Code 1 typedef long long ll; 2 const int N = 32000; 3 int prime[N]; 4 bool vis[N]; 5 int num; 6 void i
阅读全文
摘要:题目:http://acm.timus.ru/problem.aspx?space=1&num=1118题意:给出个范围 n ~ m,定义 triviality(i) = ( i 的所有因子的和) / i ;做了一晚上了,就是 WA 9 ,都快要哭了。当发现自己哪里错了时候,都想一头撞死了,我竟然把那个 所有因子和当成了因子个数来算,不仔细看题,教训。。白交了那么多次。说一下注意点:1.如果给的范围内有 1,那么 1 的triviality = 0(因为题目说了,n因子是小于n本身的) 2.如果给的范围内有素数,那么素数越大 他的triviality值就越小,所以只需找到...
阅读全文

浙公网安备 33010602011771号