题目地址: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;
}
B题:Valuable Resources
直接找行与列的最大值和最小值,不多说
代码如下:
#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 __int64
const 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;
}
C题:Bits
贪心
从小的开始,不断从低位开始加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 __int64
const 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;i<100;i++)
{
if(s[i]==0)
{
x+=(LL)1<<i;
//printf("%d\n",1<<i);
if(x>y)
{
printf("%I64d\n",z);
break;
}
z=x;
}
}
}
return 0;
}
D题:Maximum Value
对于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 __int64
const 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("%d",&x);
_hash[x]=1;
min1=min(min1,x);
max1=max(max1,x);
}
for(i=min1; i<=2000000; i++)
{
if(_hash[i-1]) dp[i]=i-1;
else dp[i]=dp[i-1];
}
ans=0;
for(i=1; i<=1000000; i++)
{
if(_hash[i])
{
for(j=2*i; ; j+=i)
{
if(dp[j]<i) continue ;
ans=max(ans,dp[j]%i);
if(dp[j]==max1) break;
//printf("%d %d\n",j,ans);
}
}
}
printf("%d\n",ans);
}
return 0;
}