【BZOJ 3560】DZY loves Math V

i1|a1i2|a2...in|anϕ(i1i2..in)

设共有质因子 tot 个,第 i 个质因子在第j个数中指数为 kij
ans=Πtoti=1ji1=0ki1ji2=0ki2...jin=0kinϕ(primenp=1jipi)

=Πtoti=1((Πnj=1pij=0kijprimepiji)1)primei1primei+1

前缀和维护一下 primeji 即可

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define p 1000000007
using namespace std;
struct hp{
    long long pi,ki;
    bool operator < (const hp &x) const
      {return (pi<x.pi)||(pi==x.pi&&ki>x.ki);}
}prime[1001001];
int a[100001];
long long mi[35];
int tot,n;
long long ans;
long long power(long long a,long long b)
{
    long long t;
    if (b==0) return 1;
    if (b==1) return a;
    t=power(a,b/2);
    if (b%2==0) return t*t%p;
    else return a*t%p*t%p;
}
int main()
{
    int i,x,j,m; long long t,tp;
    scanf("%d",&n);
    for (i=1;i<=n;++i)
      scanf("%d",&a[i]); 
    for (i=1;i<=n;++i)
      {
        x=a[i]; m=sqrt(x+0.5);
        for (j=2;j<=m;++j)
          if (x%j==0)
            {
              prime[++tot].pi=(long long)j;
              while (x%j==0)
                {prime[tot].ki++; x/=j;}
            }
        if (x!=1)
          {prime[++tot].pi=(long long)x; prime[tot].ki=(long long)1;}
      }
    sort(prime+1,prime+tot+1); 
    ans=(long long)1; t=1;
    for (i=1;i<=tot;++i)
      {
        if (prime[i].pi!=prime[i-1].pi)
          {
            if (i!=1) ans=ans*(((t-1)*((prime[i-1].pi-1+p)%p)%p*power(prime[i-1].pi,p-2)%p+1)%p)%p;
            t=1;
            mi[0]=1; tp=(long long)1;
            for (j=1;j<=prime[i].ki;++j)
              {
                tp=(tp*prime[i].pi)%p;
                mi[j]=(mi[j-1]+tp)%p;
              }
          }
        t=(t*mi[prime[i].ki])%p;
      }
    ans=ans*((((t+p-1)%p)*((prime[tot].pi-1+p)%p)%p*power(prime[tot].pi,p-2)%p+1)%p)%p;
    printf("%lld\n",ans);
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值