A题目链接
直接求出所有可能出现的数字标记一下,然后看给出的数字是否全都出现过,然后在判断和是否是n
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef __int128 LL;
map<ll , int> mp;
void dfs(ll x){
if(x == 1){
mp[x] = 1;
return ;
}
if(!mp[x]){
mp[x] = 1;
dfs(x/2);
dfs(x - x/2);
}
}
int main()
{
ll n,m;
cin >> n >> m;
LL sum = 0;
dfs(n);
int flag = 0;
for(int i = 0; i < m ;i ++){
ll x;
cin >> x;
if(!mp[x])flag = 1;
sum += x;
}
if(!flag && sum == n) cout <<"misaka"<< endl;
else cout <<"ham"<< endl;
}
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll f(ll x){
ll sum = 1;
while(x){
sum = sum*(x%10);
x /= 10;
}
return sum;
}
map<vector<ll> , ll> mp;
vector<ll> b(4),v(4);
int a[4] = {2,3,5,7};
int main()
{
ll n,k;
cin >> n >> k;
if(k == 0){
ll flag = 0;
for(int i = 0; i < n; i ++){
ll x;
cin >> x;
ll y = f(x);
if(y == 1) flag ++;
}
cout << n*(n - 1)/2 - flag*(flag-1)/2 << endl;
}
else{
ll flag = 0;
ll cnt = 0;
for(int i = 0; i < n; i ++){
ll x;
cin >> x;
ll y = f(x);
if(y){
for(int j = 0; j < 4 ; j ++){
v[j] = 0;
while(y%a[j] == 0){
y /= a[j];
v[j] ++;
}
v[j] %= k;
b[j] = (k - v[j])%k;
}
cnt += mp[b];
mp[v] ++;
}
else flag ++;
}
if(flag)
cnt = flag*(flag - 1)/2 + cnt + flag*(n - flag);
cnt = n*(n - 1)/2 - cnt;
cout << cnt << endl;
}
}
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5 + 4;
int a[200005];
map<std::vector<pair<int, int> > , int> mp;
signed main()
{
int n,k;
cin >> n >> k;
for(int i = 0; i < n; i ++){
cin >> a[i];
}
int ans = 0;
for(int i = 0 ; i < n ;i ++){
std::vector<pair<int , int > > v,bu;
int x = a[i];
for(int j = 2; j*j <= x; j ++){
int cnt = 0;
if(x%j == 0){
while(x%j == 0){
x /= j;
cnt ++;
}
}
cnt %= k;
if(cnt){
v.push_back(make_pair(j,cnt));
bu.push_back(make_pair(j,k - cnt));
}
}
if(x > 1){
v.push_back(make_pair(x, 1));
bu.push_back(make_pair(x, k - 1));
}
//if(a[i] == 8) cout << v[0].first <<" " << v[0].second << endl;
sort(v.begin(), v.end());
sort(bu.begin(), bu.end());
ans += mp[bu];
mp[v] ++;
}
cout << ans << endl;
}