2021牛客暑期多校训练营7
H. xay loves count
题意:
多少组合(i, j, k)使得ai * aj = ak , n <= 1e6
分析:
将 n 2 n^2 n2 优化一下, n ∗ n 1 / 2 n*n^{1/2} n∗n1/2
#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[1000005];
signed main()
{
int n, x;
cin>>n;
for(int i=1;i<=n;i++)
{
scanf("%lld",&x);
a[x]++;
}
int ans=0;
for(int i=1;i<=1000000;i++)
{
if(a[i])
{
for(int j=1;j*j<=i;j++)
{
if(i%j==0) ans += 2*a[j]*a[i/j]*a[i];
if(j*j==i) ans -= a[j]*a[i/j]*a[i];
}
}
}
cout<<ans;
return 0;
}
I. xay loves or
题意:
就是求 y 的个数,使得 x or y = s
分析:
将 x , s 转换成二进制,从后向前按位对比,无非就4种情况,00,01,10,11
- 00:continue
- 01:打个标记,表示 y 肯定不存在等于0的解(巨坑)
- 10: 直接输出0
- 11: k++
#include <bits/stdc++.h>
#define int long long
using namespace std;
int qpow(int a, int b)
{
int res = 1;
while (b > 0)
{
if (b & 1) res = res*a;
a = a*a;
b >>= 1;
}
return res;
}
signed main()
{
int x, s;
cin >> x >> s;
int k=0, fg=1;
while(x || s)
{
int xbit = x & 1, sbit = s & 1;
if(xbit == 1 && sbit == 0) { cout << 0 << endl; return 0; }
if(xbit == 1 && sbit == 1) k++;
if(xbit == 0 && sbit == 1) fg = 0;
x >>= 1; s >>= 1;
}
if(fg) cout << qpow(2, k) - 1 << endl;
else cout << qpow(2, k) << endl;
return 0;
}