zoukankan      html  css  js  c++  java
  • BZOJ 4916 神犇和蒟蒻

    Description

    很久很久以前,有一只神犇叫yzy;
    很久很久之后,有一只蒟蒻叫lty;

    Input

    请你读入一个整数N;1<=N<=1E9,A、B模1E9+7;

    Output

    请你输出一个整数A=sum_{i=1}^N{mu (i^2)};
    请你输出一个整数B=sum_{i=1}^N{varphi (i^2)};

    Sample Input

    1

    Sample Output

    1
    1
    第一问很好笑,众所周知,μ(i*j)如果gcd(i,j)!=1,那么μ(i*j)就是0
    也就是说,第一问无论n多大就是1
    第二问可以转化为$sum_{i=1}^ni*phi(i)$
    这是从定义式推来的
    $f[n]=n*phi(n)$
    $S[n]=sum_{i=1}^ni*phi(i)$
    然后就是杜教筛
    $g(1)S(n)=sum_{i=1}^n(f*g)(i)-sum_{i=2}^ng(i)S(frac{n}{i})$
    $sum_{i=1}^n(f*g)(i)$
    $=sum_{i=1}^nsum_{d|i}f(frac{i}{d})g(d)$
    $=sum_{i=1}^nsum_{d|i}frac{i}{d}phi(frac{i}{d})g(d)$
    因为$sum_{d|i}phi(d)=i$
    所以令g(x)=x
    $=sum_{i=1}^n{i}sum_{d|i}phi(frac{i}{d})$
    $=sum_{i=1}^ni^2$
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<algorithm>
     6 #include<map>
     7 using namespace std;
     8 typedef long long lol;
     9 int N=8000000,Mod=1e9+7,inv6;
    10 int prime[1000001],phi[8000000+5],n,tot;
    11 bool vis[8000000+5];
    12 map<int,int> M;
    13 int qpow(int x,int y)
    14 {
    15   int res=1;
    16   while (y)
    17     {
    18       if (y&1) res=1ll*res*x%Mod;
    19       x=1ll*x*x%Mod;
    20       y>>=1;
    21     }
    22   return res;
    23 }
    24 int query(int x)
    25 {int i,pos;
    26   if (x<=N) return phi[x];
    27   if (M[x]) return M[x];
    28   int as=1ll*(x+1)*x%Mod*(2*x+1)%Mod*inv6%Mod;
    29   for (i=2;i<=x;i=pos+1)
    30     {
    31       pos=x/(x/i);
    32       as-=(1ll*(pos+i)*(pos-i+1)/2)%Mod*query(x/i)%Mod;
    33       as=(as+Mod)%Mod;
    34     }
    35   return M[x]=as;
    36 }
    37 void pre()
    38 {int i,j;
    39   phi[1]=1;
    40   for (i=2;i<=N;i++)
    41     {
    42       if (vis[i]==0)
    43     {
    44       prime[++tot]=i;
    45       phi[i]=i-1;
    46     }
    47       for (j=1;j<=tot;j++)
    48     {
    49       if (1ll*i*prime[j]>N) break;
    50       vis[i*prime[j]]=1;
    51       if (i%prime[j]==0)
    52         {
    53           phi[i*prime[j]]=1ll*phi[i]*prime[j]%Mod;
    54           break;
    55         }
    56       else phi[i*prime[j]]=1ll*phi[i]*(prime[j]-1)%Mod;
    57     }
    58     }
    59   for (i=1;i<=N;i++)
    60     {
    61       phi[i]=(1ll*i*phi[i]%Mod+phi[i-1])%Mod;
    62     }
    63 }
    64 int main()
    65 {
    66   cin>>n;
    67   cout<<1<<endl;
    68   N=min(N,n);
    69   pre();
    70   inv6=qpow(6,Mod-2);
    71   printf("%d
    ",query(n));
    72 }
  • 相关阅读:
    从一道比较奇葩的笔试题说起
    如何用一个语句判断一个整数是不是二的整数次幂——从一道简单的面试题浅谈C语言的类型提升(type promotion)
    C指针(转)
    raspberry-常用命令
    raspberry-同路由器用putty和vnc桌面登录方法
    结对编程-黄金点游戏
    软件工程第一次作业
    Python机器学习(9)——聚类算法之K均值
    Python机器学习(8)——推荐算法之推荐矩阵
    Python机器学习(7)——SVM支持向量机
  • 原文地址:https://www.cnblogs.com/Y-E-T-I/p/8351609.html
Copyright © 2011-2022 走看看