BZOJ 1607 Patting Heads 轻拍牛头 (素数筛应用)

来源:互联网 发布:淘宝胡公子评价 编辑:程序博客网 时间:2024/06/05 04:38

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1607

思路:和素数筛一样的原理,记录每个数出现的次数,然后筛一遍就好了

ac代码:

#include<stdio.h>#include<math.h>#include<string.h>#include<stack>#include<set>#include<queue>#include<vector>#include<iostream>#include<algorithm>#define MAXN 1010000#define LL long long#define ll __int64#define INF 0xfffffff#define mem(x) memset(x,0,sizeof(x))#define PI acos(-1)using namespace std;LL gcd(LL a,LL b){return b?gcd(b,a%b):a;}LL lcm(LL a,LL b){return a/gcd(a,b)*b;}LL powmod(LL a,LL b,LL MOD){LL ans=1;while(b){if(b%2)ans=ans*a%MOD;a=a*a%MOD;b/=2;}return ans;}double dpow(double a,LL b){double ans=1.0;while(b){if(b%2)ans=ans*a;a=a*a;b/=2;}return ans;}//headint a[MAXN],cnt[MAXN],ans[MAXN];int main(){    int n,i,j;    while(scanf("%d",&n)!=EOF)    {        mem(cnt);mem(ans);        for(i=1;i<=n;i++)            scanf("%d",&a[i]),cnt[a[i]]++;        for(i=1;i<=1000000;i++)        {            if(cnt[i])            {                for(j=i;j<=1000000;j+=i)                    ans[j]+=cnt[i];            }        }        for(i=1;i<=n;i++)            printf("%d\n",ans[a[i]]-1);    }    return 0;}
0 0