摘要: 该题就是HUD 1792与HDOJ 1222 Wolf and Rabbit的结合,先判断公约数是否大于1,如果大于就一定输出Inf,否则,就输出m*n-n-m;#include<stdio.h>long long Gcd( long long a, long long b ){ return b==0?a:Gcd( b,a%b ); }int main(){ long long n,m; while( scanf( "%I64d%I64d",&n,&m ),n||m ) { if( Gcd( n,m )==1 ) { ... 阅读全文
posted @ 2011-08-27 17:56 wutaoKeen 阅读(118) 评论(0) 推荐(0) 编辑
摘要: 要判断给定的n(2<=n<=10^18)是不是squarefree number;因为给定的数最大达到10^18,所以直接暴力肯定是杯具的TLE;我们知道 N必为 3种之一: 素数,素数的平方,两个不同素数之积。10^18=10^6^3;那么我们求质数就只要求到10^6就可以,因为大于10^6就只能是平方次方,不可能是立方,因此可以用开方来判断;假如我们求质数小于10^6,那么可能这个数是一个数的立方,或者是一个质数的平方乘以一个数,但不能开方,但又不能被前面的质数相除,因此会造成不是squarefree number的假象。实现思路:1. 计算1000000以下 素数,存于 nu 阅读全文
posted @ 2011-08-27 16:38 wutaoKeen 阅读(469) 评论(0) 推荐(0) 编辑
摘要: 刚开始试着用n*log(n)的方法去解,但细想一下这个方法是不行的,因为精度丢失好大,后来试着推里面的规律,这个规律就是n^n变成n^(n-1)再乘以n的所有位数之和,n^( n-2 )*((n的前所有位数之和)*n的前所有位数之和),以此类推。#include<stdio.h>#include<stdlib.h>#include<math.h>inline int SUM( int n ){ int sum=0,z=1; while( n/z ) { sum+=n%(z*10)/z; z*=10; } return... 阅读全文
posted @ 2011-08-21 21:54 wutaoKeen 阅读(156) 评论(0) 推荐(0) 编辑
摘要: 看了这个题好久还是不知道怎么做,后来经过lvsi的指导,才把它给A了。m=n^n;两边同取对数,得到,log10(m)=n*log10(n);再得到,m=10^(n*log10(n));然后,对于10的整数次幂,第一位是1,所以,第一位数取决于n*log10(n)的小数部分;我们知道一个数x可以用10^(n +m)( n可以是小数,m是整数 )表示,那么10^n就是表示x/10^m之后的数及前面的数值。#include<stdio.h>#include<stdlib.h>#include<math.h>int main(){ int T; double N; 阅读全文
posted @ 2011-08-19 18:23 wutaoKeen 阅读(151) 评论(0) 推荐(0) 编辑
摘要: 该题就从最高位取余,余数再乘以10就可以了;#include<stdio.h>#include<stdlib.h>#include<string.h>int main(){ int n,m; char num[1024]; while( scanf( "%s%d",num,&m )!=EOF ) { int len=strlen( num ); int n=num[0]-'0',i=1; while( i<len ) { n=n*10+num[i]-'0'; n%=m; i++; } prin 阅读全文
posted @ 2011-08-19 17:20 wutaoKeen 阅读(150) 评论(0) 推荐(0) 编辑
摘要: 该题是一道中国剩余定理题目,刚开始我就用了一下暴力的方法 (同时也优化了一下)一下子就超时了,后来看了一下这个题的解题报告才知道要用中国剩余定理,这也是我第一次用中国剩余定理解题。这个定理又叫孙子定理。就是给定几个数 虽然不互质 然后一个数取余他们又有相应的余数。那么这个问题的答案相差的一定是这些数的最小公倍数。首先我们求出最小公倍数K;然后在N%k+1到N%k+k这个范围内暴找一下有没有一个符合所有条件的数,我们把N分成一段段的,因为在每一段一定是没有或者只有一个的。为什么可以分成一段段的,我们知道中国剩余定理求的是最小的数,那么它的倍数同样是符合条件的;所以如果有的话 sum+=n/k;不 阅读全文
posted @ 2011-08-19 16:39 wutaoKeen 阅读(1184) 评论(0) 推荐(0) 编辑
摘要: #include<stdio.h>#include<stdlib.h>int num[1024][300]={0};int main(){ int n; num[0][1]=1;num[1][1]=1;num[2][1]=2;num[3][1]=4; for( int i=4; i<=1000; i++ ) { for( int j=1;j<300; j++ ) { num[i][j]+=num[i-1][j]+num[i-2][j]+num[i-4][j]; num[i][j+1]=num[i][j]/10; num[i][j]%=10; } } whil 阅读全文
posted @ 2011-08-16 21:24 wutaoKeen 阅读(292) 评论(0) 推荐(0) 编辑
摘要: 该题与HDU1086相似都是线段相交的问题,在这里就不解释线段相交了( 在HDU 1086You can Solve a Geometry Problem too已经解释了)不过我的代码还是注释一下:#include<stdio.h>#include<stdlib.h>#include<string.h>typedef struct T{ double x,y; }point; point start[200024],end[200024];inline double judge( point p1,point p2,point p )//判断点是否在直线的 阅读全文
posted @ 2011-08-16 20:18 wutaoKeen 阅读(399) 评论(0) 推荐(1) 编辑
摘要: 求任意多边形的重心已知一多边形没有边相交,质量分布均匀。顺序给出多边形的顶点坐标,求其重心。分析:求多边形重心的题目大致有这么几种:1,质量集中在顶点上。n个顶点坐标为(xi,yi),质量为mi,则重心 X = ∑( xi×mi ) / ∑mi Y = ∑( yi×mi ) / ∑mi 特殊地,若每个点的质量相同,则 X = ∑xi / n Y = ∑yi / n2,质量分布均匀。这个题就是这一类型,算法和上面的不同。 特殊地,质量均匀的三角形重心: X = ( x0 + x1 + x2 ) / 3 Y = ( y0 + y1 + y2 ) / 33,质量分布不均匀。只能用 阅读全文
posted @ 2011-08-16 18:25 wutaoKeen 阅读(673) 评论(1) 推荐(0) 编辑
摘要: 算法简单说明: 首先判断以两条线段为对角线的矩形是否相交,如果不相交两条线段肯定也不相交。(所谓以a1b2为对角钱的矩形就是以两边长为|a1.x – b2.x|和|a1.y – b2.y|以及a1b2为对角线的矩形)。如果相交的话,利用矢量叉乘判断两条线段是否相互跨越,如果相互跨越显然就相交,反之则不相交。算法不难,但是一些特殊情况需要考虑到,比如两条相段共线且在断点处相交。下面的代码经过测试了,应该没有bug,如果你真的发现了bug请告诉我:) /******************************************************** * * * 返回(P1-P0)* 阅读全文
posted @ 2011-08-16 16:55 wutaoKeen 阅读(196) 评论(0) 推荐(0) 编辑