analysis
算是一眼题吧
n方很好想
考虑优化?
若Aj∣AiA_j|A_iAj∣Ai
设f(Ai)f(A_i)f(Ai)为值为AiA_iAi的纸片要拍的牛头数
则很容易有:f(Ai)=∑Aj∣Aif(Aj)f(A_i)=\sum_{A_j|A_i}f(A_j)f(Ai)=∑Aj∣Aif(Aj)
这不就是DP里面的刷表法吗
code
#include <bits/stdc++.h>
using namespace std;
int n, a[100001];
int h[1000001];
int T[1000001];
int s;
int maxi;
inline int read() {
char ch = getchar();
while (ch < '0' || ch > '9') ch = getchar();
int x = 0;
while (ch >= '0' && ch <= '9') {
x = x * 10 + ch - '0';
ch = getchar();
}
return x;
}
int main() {
n = read();
for (int i = 1; i <= n; i++) {
a[i] = read();
T[a[i]]++;
maxi = max(maxi, a[i]);
}
for (int i = 1; i <= maxi; i++) {
if (T[i] == 0)
continue;
for (int j = i; j <= maxi; j += i) h[j] += T[i];
}
for (int i = 1; i <= n; i++) printf("%d\n", h[a[i]] - 1);
return 0;
}