待补:D,E;http://codeforces.com/contest/895/problem/D
http://codeforces.com/contest/895/problem/E
题解:http://codeforces.com/blog/entry/56028
参考:
http://codeforces.com/contest/895/standings/friends/true
B:这个地方多写写就知道-1+k的细节了。。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=100005;
ll a[MAXN];
int main()
{
int n;
ll x,k;
scanf("%d%lld%lld",&n,&x,&k);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
sort(a+1,a+n+1);
ll res=0;
for(int i=1;i<=n;i++)
{
ll d=max(a[i],((a[i]-1)/x+k)*x),u=((a[i]-1)/x+k+1)*x-1;
// printf("%lld %lld\n",d,u);
res+=max(0,upper_bound(a+1,a+n+1,u)-lower_bound(a+1,a+n+1,d));
}
printf("%lld\n",res);
return 0;
}
C:这个地方的做法很巧妙,
把不可能会变成0的剔除掉,这样就可以得到可以变为0的数的个数了。。
#include<bits/stdc++.h>
using namespace std;
const int Mod=1000000007;
bool isprime(int x)
{
for(int i=2;i*i<=x;i++)
if(x%i==0)return 0;
return 1;
}
int p[75];
int main()
{
int cnt=0;
for(int i=2;i<=70;i++)
if(isprime(i))p[cnt++]=i;
vector<int> base;
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int a,t=0;
scanf("%d",&a);
for(int i=0;i<cnt;i++)if(a%p[i]==0)
while(a%p[i]==0)a/=p[i],t^=(1<<i);
for(int i=0;i<(int)base.size();i++)
t=min(t,t^base[i]);
if(t)base.push_back(t);
}
// printf("%d\n",(int)base.size());
int res=1;
for(int i=(int)base.size();i<n;i++)
res=2*res%Mod;
printf("%d\n",(res+Mod-1)%Mod);
return 0;
}