就是输出n时,莫比乌斯函数的值。直接将n唯一分解即可。
思路:筛出105以内的素数,因为109开方,105就差不多。当一个大数还没有被1000个素数分解,那么这个数基本上可以认为是素数(为合数为小概率了)。使用欧拉筛筛出105以内的素数,然后枚举素数试除即可
ac代码:
#include<cstdio> #include<cstring> #define maxn int(1e5) #define ll long long int prime[maxn]; bool vis[maxn]; int Prime() { int cnt = 0; for (int i = 2; i < maxn; ++i) { if (!vis[i]) { prime[cnt++] = i; } for (int j = 0; j <= cnt&&prime[j] * i < maxn; ++j) { vis[prime[j] * i] = 1; if (i%prime[j] == 0){ break; } } } return cnt; } int main() { int k=Prime(); int m = 1; ll n; scanf("%lld", &n); for (int i = 0; i < k&&n!=1; ++i) { if (n%prime[i]==0) { int h = 0; while (n%prime[i] == 0){ ++h; n /= prime[i]; } if (h != 1){ printf("0 "); return 0; } m = -m; } } if (n>1)printf("%d ", -m); else printf("%d ", m); }