12 2011 档案
摘要:解决一些数学问题时,能简化公式会省很多事~一看这题的数据就知道有暴力会超,然后上网看了一下别人的思路,是用的欧拉公式,刚开始没弄懂,不敢写,看了书上写的推出的公式,很简单,但推理过程不甚明白,以后慢慢研究,先学会用欧拉公式吧。欧拉φ函数:phi(n)是所有小于n的正整数里,和n互素的整数的个数。n是一个正整数。设n=a1^x1*a2^x2*a3^x3.....*an^xn,那么n的欧拉函数就是:phi(n)=a1^(x1-1)*(a1-1)*a2^(x2-1)*(a2-1)*......an^(xn-1)*(an-1);整理可得:phi(n)=n*(a1-1)*(a2-1)*.......(a
阅读全文
摘要:这题的意思就是要求两点之间是否有整数点,刚开始想用斜率做的,但没想出来怎么做,暴力了一下,没过~~上网看了一下别人的思路,果然。。。。自己还是弱啊~这题的思路是相似三角形,若AC之间有整数点F,则必有AB/BC=AE/EF,即AB与BC必有不小于一的公约数,所以直接转化成求AB、BC是否有不为一的最大公约数的问题了~代码: 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #include<math.h> 5 int gcd(int a,int b) 6 { 7 if(
阅读全文
摘要:再次鄙视一下自己的英语水平,竟然没读懂题,好吧,我要学英语~~这题很简单,数据给的也很小,只要简单的模拟就过了,意思是:由括号序列S可经P规则和W规则变形为P序列和W序列。p规则是:pi是第i个右括号左边的左括号的数;w规则是:wi是第i右括号与它匹配的左括号之间右括号的数(其中包括它本身)。代码: 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 int p[25],s[25]; 5 char str[55]; 6 int main() 7 { 8 int t,n,i,j,k;
阅读全文
摘要:感觉自己的dfs学的很烂,正好用这道题练练,顺便再研究一下dfs的思想~这题还有一个要注意的地方就是输出格式的问题,PE了两次~代码: 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 int f[15],a[15],b[15]; 5 int n; 6 void dfs(int x,int s) 7 { 8 int i; 9 b[s]=a[x];10 if(s==6)11 {12 for(i=1;i<=6;i++)13 {14 i...
阅读全文
摘要:感觉自己很菜,一个栈的应用,写了好久,还是代码能力弱啊~刚开始直接用的<stack>开了两个栈,结果在判空时出现问题,改用自己写的栈,还是WA,一怒之下上网查了一下,原来是我理解有问题,汗~~我们在算加减乘除的时候,总是先算乘除,再算加减,还有一点就是,再算加减的时候也要从左往右算,否则就WA了。自己写的代码,WA了: 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 int jud(char a,char b) 5 { 6 if((a=='+'||a=
阅读全文
摘要:很水~就是记录j的位置就行了,可是第一次WA了,以为是自己理解有误,上网上看了一下,原来是并行的问题。//这样写是错的if(x==s)s=y;if(y==s)s=x;要用if...else if代码: 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 int main() 5 { 6 int t,m,x,y,s; 7 scanf("%d",&t); 8 while(t--) 9 {10 scanf("%d",&m);11 s=
阅读全文
摘要:刚看到这题就知道要有筛选,开始没想到怎么做,后来想,能不能将素数先筛出来,素数都为1嘛,然后再用暴力求剩下的,结果悲哀的RE了,于是上网查,看到他们竟然用筛选法直接求每个数的因子,感觉自己太笨了,一直以为,埃勒托色尼筛选法只能筛选素数,是我对算法的理解不够深入。。。。。。。代码: 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 int f[500005]; 5 int main() 6 { 7 int i,j,t,n; 8 for(i=0;i<=500000;i++) 9
阅读全文
摘要:找规律题,其实这题想通了也很简单,就是记录1的位置,第一次时,t都等于1,然后是t=2,t=4,t=8......知道t大于了n,即1的位置到了后半部分,此时,如果1是在n+1的位置,那么它的下一次就会变成顺序的,否则就继续从前往后找,直到1在n+1的位置为止。举个例来说,n=6,1 2 3 4 5 6 | 7 8 9 10 11 12 //t=1;7 1 8 2 9 3 | 10 4 11 5 12 6 //t=2;10 7 4 1 11 8 | 5 2 12 9 6 3 //t=4;5 10 2 7 12 4 | 9 1 6 11 3 8 //t=8此时,1的位置已经到了后半部...
阅读全文
摘要:刚开始用公式暴力做了一下,RE了,不得不转战其他方法,看着公式貌似很有规律的样子就试着找了一下,结果就这么A了,嘿嘿~代码: 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 int f[4][1000002]; 5 int main() 6 { 7 int i,j; 8 int m,n; 9 for(i=0;i<=1000000;i++)10 f[1][i]=i+2;11 for(i=0;i<=1000000;i++)12 {13 f[2][i]=i+...
阅读全文
摘要:刚开始没看懂题,看了题给的例子,说是101可能有91或100的来,以为是让求只有只有一个数得来的那些数呢,暴力做了一下,WA了。然后搜了一下,发现是让求不是任何数的和的那些数,无语~代码: 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 int h[1000002]; 5 int main() 6 { 7 int i,j,s; 8 memset(h,0,sizeof(h)); 9 for(i=1;i<=1000000;i++)10 {11 j=i;s=i;12 ...
阅读全文
摘要:其实这题很水~但是通过做这题我终于知道了cin的输入有多慢了,以前做题总感觉自己很别人的思路一样怎么就慢了那么长时间呢,现在知道了,有一部分原因是有cin,cout输入输出的原因。这题用cin输入会超时,有scanf就ok了。其实这题就是一个递推公式,dp[i][j]=max(dp[i-1][j],max(dp[i-1][j-1],dp[i][j-1]));代码: 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 int a[1002][1002]; 5 int max(int x
阅读全文
摘要:读完题就知道是一道模拟题,但遗憾的是我的模拟题做得并不好,可能是自己的代码能力还不够好吧~~放了一段时间,今天中下决心做了。刚开始觉得用while一直搜到一个上升或下降序列的最后,但对于像4 4 4 4 这样的序列就不好判断属于上升还是下降序列了,后来看了一下解题报告,明白了~其实不用管一个上升或下降序列到底用多长,只判断这个数与他前面的数构成上升还是下降就可以了,中间加些判断的标量~代码: 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #include<iostream
阅读全文
摘要:水题~,就是给你两个数,先把这两个数翻转,然后将这两个数相加在翻转输出,注意不要输出前导零,但中间的零要输出。代码: 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #include<iostream> 5 using namespace std; 6 int reverse(int x) 7 { 8 int s=0; 9 while(x)10 {11 s=s*10+x%10;12 x=x/10;13 }14 return s;15 }16 i...
阅读全文
摘要:这题的意思就是求前后数差值的绝对值的个数,而且不能重复,本来想用hash的,但是题目没给出数的范围不好用,上网上找了下,看到他们都用bitset做的,就顺带学了一下bitset的用法,收获很大。代码: 1 #include<stdio.h> 2 #include<iostream> 3 #include<bitset> 4 #include<math.h> 5 using namespace std; 6 int main() 7 { 8 bitset<4000>b; 9 int n,m;10 while(scanf("%d
阅读全文
摘要:水题,刚开始没读懂题意,后来明白怎么回事了,不得不说真的很水~其实题目就是给你一个01序列让你计算将该序列变成01交替的序列最少需要几步~代码: 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<iostream> 4 using namespace std; 5 int main() 6 { 7 int n,x,s1,s2,m1,m2; 8 while(scanf("%d",&n)!=EOF) 9 {10 s1=s2=m1=m2=0;11 for(int i=1;i<=
阅读全文
摘要:一道简单的大整数加法题,让我做了整整一晚上,无语~~太马虎了,题目中说每个数长度小于等于100,但和不一定小于100啊,唉~·我就在栽在了这上面~~代码: 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #include<iostream> 5 using namespace std; 6 int main() 7 { 8 int t,i,len,k,a[103],b[103],l,tem; 9 char str[103];10 while(scanf(&q
阅读全文
摘要:这道题的意思是说,输入一数列,如果前面是‘P’,则就该数列各个数的逆序对输出,输入‘I’则将原来的数列输出。第一种情况比较好处理,第二种有点小麻烦。第二种情况要符合下面两个要求:1、先找到a[i]中最小的放在开头;2、i前面要有a[i]个比i大的数;代码: 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #include<iostream> 5 using namespace std; 6 int a[102],b[102]; 7 int jude(int x,int
阅读全文

浙公网安备 33010602011771号