P8054 A 质因数
明显看到,题目时间限制 ,暴力肯定过不了。但是我们观察一下,需要 且 ,我们先用暴力看一下规律:
#include <bits/stdc++.h>
using namespace std;
#define int long long
int sum(int x)
{
int cnt = 0, q = x;
for (int i = 2; i <= x; i++)
{
if (q % i == 0)
{
while (q % i == 0)
{
q /= i;
cnt++;
}
}
}
return cnt;
}
signed main()
{
int n = 1000;
for (register int i = 1; i <= n; i++)
{
int x = i;
int g = x;
int k = sum(g);
bool f = true;
for (register int j = 2; j < g; j++)
{
if (sum(j) > k)
{
goto end;
f = false;
break;
}
}
if (f)
{
cout << i << " ";
k = i;
}
end: {}
}
return 0;
}
显然,输出 0 的很少,我们看一下最终的输出:
1 2 3 4 6 8 12 16 24 32 48 64 96 128 192 256 384 512 768
……
也就是说,对于每一个询问,从 开始,第一次加两个 ,第二次加两个 ,第三次加两个 ……,直到加到这个询问的数。如果正好到了这个询问的数,那就输出 0,不然输出 1。
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
int n;
cin >> n;
while (n--)
{
int x, now = 4, plus = 2;
scanf("%lld", &x);
if (x <= 4) printf("0\n");
else
{
bool f = false;
while (true)
{
now += plus;
if (now == x)
{
printf("0\n");
f = true;
break;
}
now += plus;
if (now == x)
{
printf("0\n");
f = true;
break;
}
plus <<= 1;
if (now > x) break;
}
if (!f)
{
printf("1\n");
}
}
}
return 0;
}

浙公网安备 33010602011771号