苏州住房与城乡建设部网站/东莞网络推广招聘
2021牛客多校第七场
- H xay loves count
- 思路
- 附上代码
- H xay loves or
- 思路
- 附上代码
H xay loves count
思路
题解上说是可以直接枚举,不过我们这边是先求出每个数的因数,再从中找有多少中情况,估计复杂度会稍微低一点。
附上代码
#include <iostream>
#include <bits/stdc++.h>#define INF 0x3f3f3f3f
#define pi 3.141592653589793238462643383279using namespace std;
typedef long long ll;const int maxn=1e6+10;
vector<ll>DIV[maxn];
ll cnt[maxn];
void getDIV(int x)
{if(x==1){DIV[x].push_back(1);return ;}else if(x==2){DIV[x].push_back(2);DIV[x].push_back(1);return ;}DIV[x].push_back(1);DIV[x].push_back(x);for(int i=2; i<=(sqrt(x)); i++){if(x%i==0){DIV[x].push_back(i);if(i!=(x/i))DIV[x].push_back(x/i);}}
}
ll n,a[maxn],mx;
ll ans;
int main()
{scanf("%lld",&n);for(int i=1; i<=n; i++){scanf("%lld",a+i);if(DIV[a[i]].size()==0)getDIV(a[i]);mx=max(a[i],mx);cnt[a[i]]++;}for(int i=1; i<=mx; i++){if(cnt[i]==0)continue;int len=DIV[i].size();for(int j=0; j<len; j++){int x=i/DIV[i][j],y=i/x;ans+=(ll)cnt[i]*cnt[x]*cnt[y];}}printf("%lld\n",ans);return 0;
}
H xay loves or
思路
主要就是注意要将等于零的一种情况给排除出去,其他情况应该都很好判断。按每一位来说,分为四种情况,我们直接按位来计算即可。
附上代码
#include <iostream>
#include <bits/stdc++.h>#define INF 0x3f3f3f3f
#define pi 3.141592653589793238462643383279using namespace std;
typedef long long ll;int main()
{ll x,s,sum=1;scanf("%lld%lld",&x,&s);ll xx=x,ss=s;int a,b;for(int i=1;i<32;i++){a=x&1;b=s&1;if(a==1&&b==1){sum=sum*2;}else if(a==1&&b==0){sum=0;break;}x>>=1;s>>=1;}if((xx|0)==ss&&sum>0)cout<<sum-1<<endl;elsecout<<sum<<endl;return 0;
}