[蓝桥杯 2018 国 B] 矩阵求和

  • 阿里云国际版折扣https://www.yundadi.com

  • 阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

    题目描述

    经过重重笔试面试的考验小明成功进入 Macrohard 公司工作。

    今天小明的任务是填满这么一张表

    表有 n 行 n 列行和列的编号都从 1 算起。

    其中第 ii 行第 jj 个元素的值是 gcd(i,j) 的平方gcd 表示最大公约数以下是这个表的前四行的前四列

    1  1  1  1
    1  4  1  4
    1  1  9  1
    1  4  1 16
    

    小明突然冒出一个奇怪的想法他想知道这张表中所有元素的和。 由于表过于庞大他希望借助计算机的力量。

    输入格式

    一行一个正整数 n 意义见题。

    输出格式

    一行一个数表示所有元素的和。由于答案比较大请输出模1000000007即109+7后的结果。

    输入输出样例

    输入 #1复制

    4

    输出 #1复制

    48

    说明/提示

    对于 30\%30% 的数据n\le 1000n≤1000。

    存在 10\%10% 的数据n = 10^5n=105。

    对于 60\%60% 的数据n\le 10^6n≤106。

    对于 100\%100% 的数据n\le 10^7n≤107。

     解题思路要求∑∑gcd(i,j)²

    枚举最大公约数d,∑d∑∑(gcd(i,j)²==d)

    把d替换成d²∑d²∑∑(gcd(i,j)==d)

    又(i/gcd(i,j))*(j/gcd(i,j))=1上式化为

     第三个求和可以用欧拉函数表示即

     接下来线性筛法求欧拉函数然后前缀和即可。

    #include<bits/stdc++.h> 
    using namespace std;
    typedef long long ll;
    const int N=1e7+5;
    int presum[N];
    vector<int>prime;
    bool vis[N];
    int phi[N];
    void get_phi(int n)
    {
        phi[1]=1;
        for(int i=2;i<=n;i++)
        {
            if(!vis[i])
            {
                phi[i]=i-1;
                prime.emplace_back(i);
            }
            for(int j=0;j<prime.size()&&i*prime[j]<=n;j++)
            {
                vis[i*prime[j]]=true;
                if(i%prime[j]==0)
                {
                    phi[i*prime[j]]=phi[i]*prime[j];break;
                }
                else phi[i*prime[j]]=phi[i]*(prime[j]-1);
            }
        }
    }
    int main( )
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        int n;cin>>n;
        int mod=1e9+7;
        get_phi(n);
        for(int i=1;i<=n;i++)
        {
            presum[i]=presum[i-1]+phi[i];presum[i]%=mod;
        }
        ll ans=0;
        for(ll i=1;i<=n;i++)
        {
            ans=(ans+((i*i%mod)*(presum[n/i]*2-1))%mod)%mod;
        }
        cout<<ans;
        return 0;
    }

  • 阿里云国际版折扣https://www.yundadi.com

  • 阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6