C题解 【LittleXi】头好痛感觉要长脑子了O.o?
玄学题,时间复杂度O(能过)
其实仔细算一下时间复杂度不超过O(ans+n)
解题思路
其实出题人已经疯狂暗示了这个题的解法
保证输出的num数量不会超过9e7
,并且说了两次这个
那么其实我们想要的cnt大概率就是一个一个数
那么怎么数呢?
题目说了这n个数每个数的平方的约数只有3个 , 其实就是质数
好,那我们统计的时候,直接暴力dfs,先排序然后简单剪枝一下,就可以通过啦
注意会爆long long~
运行时间500ms
//哔哩哔哩求关注qwq:https://space.bilibili.com/524432272?spm_id_from=333.1007.0.0
#include<bits/stdc++.h>
using namespace std;
#define int long long
vector<int> a;
int r = 0 ,cnt = 0;
void dfs(int i, int val)
{
if (val <= r && val > 1)
cnt++;
for (int j = i; j < a.size(); j++)
{
__int128 t = (__int128)val * (__int128)a[j];
if (t > (__int128)r) break;
dfs(j, val * a[j]);
}
}
void solve()
{
int n;
cin>>n;
a.resize(n);
for(int&x:a)cin>>x;
a.erase(unique(a.begin(),a.end()), a.end());
sort(a.begin(), a.end());
cin>>r;
dfs(0, 1);
cout << cnt << endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
solve();
}