摘要: /**State: 3117 0MS 424K 1028 B C++*题目大意:* 求出第nth个fib数,要求大于8位的只输出前4位跟后4位。*解题思路:* 后四位可以用矩阵快速幂来求,但是根据模的特性,发现原来* 周期15000fib又会回来。所以可以用数组来保存这个循环节即可。* 而前四位可以用log10.来计算,原来就是每一个数都可以用科学* 计数法来表示,我们用log10来取出每一个数科学计数法的那几个* 决定位权数的值,然后要n位就乘以10^n.不过要注意精度问题哦。*/Vi... 阅读全文
posted @ 2012-08-03 11:27 cchun 阅读(426) 评论(0) 推荐(0) 编辑
摘要: 题目大意: 求fibonacci数列的前面四位,注意f[0] = 0;解题思路: 凡是要求数的前面几位的,都可以用两边求对数的思想。让我想起了,m = n^n.要求n的前面一位。这个时候用对数,lg(m) = n*lg(n), m = pow(10, n*lg(n)),之后求n*lg(n)的小数部分,因为整数部分为10^P(p代表整数),全都为10000……,而小数部分则为10^B(B代表小数部分),所以要取几位,就去小数那里取即可。 这是网络上摘来的,写得very good: 先看对数的性质,loga(b^c)=c*loga(b),loga(b*c)=loga(b)+loga(c); 假设给 阅读全文
posted @ 2012-08-03 02:13 cchun 阅读(179) 评论(0) 推荐(0) 编辑
摘要: 题目大意: 给你一个数的大小为n, 1 ≤ n ≤ 10^7,求它的阶乘的位数。解题思路: 暴力是不可能了,数能够达到10^7,暴力出来的数,数组都放不下。 其实有一个公式叫斯特林公式, result=(long)((log10(sqrt(4.0*acos(0.0)*n))+n*(log10(n)-log10(exp(1.0))))+1); 其中,该公式不适用于n=1的情况,所以n=1时要另外考虑。代码:#include<iostream>#include<cmath>using namespace std;int main(void){ int cas; scanf( 阅读全文
posted @ 2012-08-03 02:12 cchun 阅读(176) 评论(0) 推荐(0) 编辑
摘要: 题目大意: 一个人从原点射箭,求要射中(x,y)的那个物体的箭射出前与x轴的角度。(用弧度表示)解题思路: 用公式的方法, x = v * t * cos(a); -> t = x/v/cos(a); y = v*sin(a)*t - 1/2*g*t*t; 将一式中的t代入y中,变形得到: g*x*x*tan^2(a) - 2*v*v*x + g*x*x + 2*v*v*y = 0; 然后用求根公式求解,题目要求求最小的那个角度,所以等于 atan((-b-sqrt(temp))/2.0/a),有两种情况要考虑,1、方程无解输出-1。2、目标处于y轴的时候输出pi/2,或者目标在x轴上, 阅读全文
posted @ 2012-08-03 02:11 cchun 阅读(149) 评论(0) 推荐(0) 编辑
摘要: 题目大意: 一个圆台型的杯子,告诉你杯子的水的体积,要求水的高度。解题思路: 将水的高度作为x,然后化简出f(x)方程,二分求x,至于圆台的体积公式:v = pi * h * (R*R+R*r+r*r) / 3; 水的高度根据直角梯形的面积公式即可求解。代码:/**圆台体积公式:v = pi * h * (R*R+R*r+r*r) / 3;*水的体积: v = pi * sqrt(r*q) * (r*R + sqrt(r*R)*r+r*r) / 3;*/#include<iostream>#include<cmath>using namespace std;const 阅读全文
posted @ 2012-08-03 02:11 cchun 阅读(184) 评论(0) 推荐(0) 编辑
摘要: 题目大意: 给你一个直角三角形的一条直角边的平方n,这条边可能是直角边,然后要求求出另外一条直角边,还有求出斜边的长度,要求另外一条直角边跟斜边都是整数。1 <= n <= 10^9.解题思路: 给出的直角边异常巨大,而且另外两条边的长度根本没有上限。但是可以转换。z^2 - y^2 = n,那么有(z + y)*(z - y) = n,变成了a * b = n,由于z跟y都是整数,那么a跟b都是整数,并且a跟b都肯定大于0,是自然数,因为z必定大于y。所以枚举出所有a跟b,然后z + y = a, z - y = b,由这两个公式求出z跟y即可。解题感想: 比赛的时候稍微想到了转 阅读全文
posted @ 2012-08-03 02:10 cchun 阅读(164) 评论(0) 推荐(0) 编辑
摘要: 题目大意: 求n个人的错排数量。解题思路: 错排公式:f[i] = (i-1)*(f[i-1] + f[i-2]);代码:#include<iostream>using namespace std;int main(void){ __int64 f[21]; f[1] = 0; f[2] = 1; for(int i = 3; i < 21; i++) f[i] = (i - 1) * (f[i-1] + f[i-2]); int n; while(scanf("%d", &n) == 1) { cout << f[n] << 阅读全文
posted @ 2012-08-03 02:10 cchun 阅读(98) 评论(0) 推荐(0) 编辑
摘要: 转载请注明出处:優YoUhttp://user.qzone.qq.com/289065406/blog/1301543725大致题意:给定一个矩形网格的长m和高n,其中m和n都是unsigned int32类型,一格代表一个单位,就是一步,求从左下角到右上角有多少种走法,每步只能向上或者向右走解题思路:非常水的中学数学题,用组合做先简单建立一个数学模型:只要给定了长m和高n,那么要从左下角走到右上角,不管怎么走,一定要往右走m次,往上走n次例如给定 m=5,n=4那么可以 上上上上上右右右右又可以 上右上右上右上右上等等。。。关键是“上”和“右”的先后问题,就是组合问题了那么数学模型就是从n+ 阅读全文
posted @ 2012-08-03 02:09 cchun 阅读(573) 评论(0) 推荐(0) 编辑
摘要: /**State: 2256 0MS 260K 2351 B C++*题目大意:* 求(sqrt(2) + sqrt(3))^2n取下界之后mod1024* (1 <= n <= 10^9)。*解题思路:* 看到了n那么大,肯定是二分求幂,但是精度是个* 问题。可以(sqrt(2) + sqrt(3))^2n = (5 + 2sqrt(6))^n* 然后令5+2sqrt(6)^n = an + bn * sqrt(6)* = (5 + 2sqrt(6... 阅读全文
posted @ 2012-08-03 01:34 cchun 阅读(170) 评论(0) 推荐(0) 编辑