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 }
View Code

 

posted @ 2018-10-24 23:56  kafuuchino  阅读(162)  评论(0编辑  收藏  举报