题目地址:http://codeforces.com/contest/485
A题:Factory
按照过程模拟,并判断是否出现循环,如果出现循环,说明肯定不可能,直接跳出。
代码如下:
#include <iostream>#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;int _hash[100001];int main(){ int a, m, i, flag=0; memset(_hash,0,sizeof(_hash)); scanf("%d%d",&a,&m); a=a%m; _hash[a]=1; while(1) { a=a*2%m; if(a==0) { flag=1; break; } if(_hash[a]) { break; } _hash[a]=1; } if(!flag) puts("No"); else puts("Yes"); return 0;}</algorithm></string.h></stdio.h></iostream>
直接找行与列的最大值和最小值,不多说
代码如下:
#include <iostream>#include <cstdio>#include <string>#include <cstring>#include <stdlib.h>#include <math.h>#include <ctype.h>#include <queue>#include <map>#include <set>#include <algorithm>using namespace std;#define LL __int64const LL INF=1e11;int main(){ LL n, x, y, max1, max2, min1, min2, s; while(scanf("%I64d",&n)!=EOF) { max1=-INF; max2=-INF; min1=INF; min2=INF; while(n--) { scanf("%I64d%I64d",&x,&y); max1=max(max1,x); max2=max(max2,y); min1=min(min1,x); min2=min(min2,y); } s=max(max1-min1,max2-min2); s*=s; printf("%I64d\n",s); } return 0;}</algorithm></set></map></queue></ctype.h></math.h></stdlib.h></cstring></string></cstdio></iostream>
贪心
从小的开始,不断从低位开始加1,直到大于较大数为止。
代码如下:
#include <iostream>#include <cstdio>#include <string>#include <cstring>#include <stdlib.h>#include <math.h>#include <ctype.h>#include <queue>#include <map>#include <set>#include <algorithm>using namespace std;#define LL __int64const LL INF=1e11;int s[1000];int main(){ int n, len, max1; LL x, y, z1, z, i; scanf("%d",&n); while(n--) { scanf("%I64d%I64d",&x,&y); z1=x; len=0; memset(s,0,sizeof(s)); while(z1) { s[len++]=z1%2; z1/=2; } z=x; for(i=0;iy) { printf("%I64d\n",z); break; } z=x; } } } return 0;}</algorithm></set></map></queue></ctype.h></math.h></stdlib.h></cstring></string></cstdio></iostream>
对于x来说,在k*x~(k+1)*x这段范围内,余数最大的肯定是最接近(k+1)*x的数,所以可以预处理出来所有最接近当前数的数,然后分别枚举每个数的倍数,并不断更新即可。
代码如下:
#include <iostream>#include <cstdio>#include <string>#include <cstring>#include <stdlib.h>#include <math.h>#include <ctype.h>#include <queue>#include <map>#include <set>#include <algorithm>using namespace std;#define LL __int64const int INF=0x3f3f3f3f;int _hash[2100000], dp[2100000], a[2100000];int main(){ int n, i, j, x, min1, ans, max1; while(scanf("%d",&n)!=EOF) { memset(_hash,0,sizeof(_hash)); min1=INF; max1=-1; for(i=0; i<n i scanf _hash min1="min(min1,x);" max1="max(max1,x);" for if dp else ans="0;" j continue break printf return> <br> <br> <p></p> </n></algorithm></set></map></queue></ctype.h></math.h></stdlib.h></cstring></string></cstdio></iostream>