BZOJ1607: [Usaco2008 Dec]Patting Heads 轻拍牛头
【传送门:BZOJ1607】
简要题意:
给出n个数,求出在其他数中有多少个数为每个数的约数(lydsy的题意好像错了)
题解:
听说用叫什么筛选的方法QAQ,不会,结果偷窥了神犇,发现常数不大
就直接用O(k2)的时间复杂度,k为常数
记录n个数的最大值,然后将n个数不断累积倍数,得到的值的次数加1,然后记录答案,要记得每个数都不能选自己
参考代码:
#include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; int a[1100000]; int s[1100000]; int ans[1100000]; int main() { int n; scanf("%d",&n); int mmax=0; memset(s,0,sizeof(s)); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); s[a[i]]++; mmax=max(mmax,a[i]); } for(int i=1;i<=mmax;i++) { if(s[i]>0) { for(int j=i;j<=mmax;j+=i) { ans[j]+=s[i]; } } } for(int i=1;i<=n;i++) printf("%d\n",ans[a[i]]-1); return 0; }
渺渺时空,茫茫人海,与君相遇,幸甚幸甚