bzoj1607 / P2926 [USACO08DEC]拍头Patting Heads
P2926 [USACO08DEC]拍头Patting Heads
把求约数转化为求倍数。
累计每个数出现的个数,然后枚举倍数累加答案。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cctype> 5 #define re register 6 using namespace std; 7 void read(int &x){ 8 static char c=getchar();x=0; 9 while(!isdigit(c)) c=getchar(); 10 while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=getchar(); 11 } 12 void output(int x){ 13 if(!x){putchar(48);return;} 14 static int wt[50],l=0; 15 while(x) wt[++l]=x%10,x/=10; 16 while(l) putchar(wt[l--]+48); 17 } 18 #define N 1000001 19 int n,a[100002],d[N],f[N]; 20 int main(){ 21 read(n); 22 for(re int i=1;i<=n;++i) read(a[i]),++d[a[i]]; 23 for(re int i=1;i<N;++i){ 24 if(!d[i]) continue; 25 for(re int j=1;j*i<N;++j) f[j*i]+=d[i]; 26 } 27 for(re int i=1;i<=n;++i) 28 output(f[a[i]]-1),putchar('\n');//扣掉自己 29 return 0; 30 }