bzoj3944 Sum

来源:https://www.cnblogs.com/wxyww/archive/2019/12/25/bzoj3944.html
-Advertisement-
Play Games

"題目鏈接" problem 給出一個$n,n include include include include include include include include using namespace std; typedef long long ll; const int N = 50001 ...


題目鏈接

problem

給出一個\(n,n < 2^{31}\)。分別求

\[\sum\limits_{i=1}^n\varphi(i),\sum\limits_{i=1}^n\mu(i)\]

solution

\(\varphi(i)\)\(\mu(i)\)都是積性函數。

\(\varphi(p^k)=(p-1)p^{k-1}\),所以可以直接\(Min\_25\)篩了。

因為\(\varphi(p)=p-1,p是質數\),g函數不好處理

所以將\(\varphi(p)\)分為兩個函數\(f_1(p)=p,f_2(p)=1\)。然後分別求\(g\)\(h\)

\(\mu\)預處理就直接是\(-h\)了。

然後\(Min\_25\)篩模板就行了。

RP--

跑了9964ms

code

/*
* @Author: wxyww
* @Date:   2019-12-25 20:16:31
* @Last Modified time: 2019-12-25 21:38:39
*/
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#include<ctime>
#include<cmath>
using namespace std;
typedef long long ll;
const int N = 500010;
ll read() {
    ll x = 0,f = 1;char c = getchar();
    while(c < '0' || c > '9') {
        if(c == '-') f = -1; c = getchar();
    }
    while(c >= '0' && c <= '9') {
        x = x * 10 + c - '0'; c = getchar();
    }
    return x * f;
}
ll m,n,pri[N],vis[N],js,tot,g[N],h[N],sum[N];
void pre() {
    for(int i = 2;i <= 500000;++i) {
        if(!vis[i]) pri[++js] = i,sum[js] = sum[js - 1] + i;
        for(int j = 1;j <= js && 1ll * pri[j] * i <= 500000;++j) {
            vis[pri[j] * i] = 1;
            if(i % pri[j] == 0) break;
        }
    }
}
ll w[N],id1[N],id2[N];
ll Sphi(ll now,ll x) {
    if(now <= 1 || pri[x] > now) return 0;
    
    ll k;

    if(now <= m) k = id1[now];
    else k = id2[n / now];
    ll ret = g[k] - h[k] - sum[x - 1] + x - 1;

    for(int k = x;k <= tot && pri[k] * pri[k] <= now;++k) {
        ll p = pri[k];
        for(int e = 1;p * pri[k] <= now;++e,p *= pri[k]) {
            ret += (pri[k] - 1) * (p / pri[k]) * Sphi(now / p,k + 1) + p * (pri[k] - 1);
        }
    }
    return ret;
}
ll Smu(ll now,ll x) {
    if(now <= 1 || pri[x] > now) return 0;

    ll  k;
    if(now <= m) k = id1[now];
    else k = id2[n / now];

    ll ret = -h[k] + x - 1;
    for(int k = x;k <= tot && pri[k] * pri[k] <= now;++k) {

            ret -= Smu(now / pri[k],k + 1);
    } 
    return ret;
}
void solve() {
    m = sqrt(n);
    if(!n) return (void)puts("0 0");
    tot = 0;
    // memset(g,0,sizeof(g));memset(h,0,sizeof(h));

    for(ll l = 1,r;l <= n;l = r + 1) {
        r = n / (n / l);
        w[++tot] = n / l;
        if(n / l <= m) id1[n / l] = tot;
        else id2[r] = tot;

        g[tot] = ((w[tot] + 2) * (w[tot] - 1)) / 2;
        h[tot] = w[tot] - 1;

    }
    // puts("!!");
    for(int j = 1;j <= js && pri[j] <= m;++j) {
        for(int i = 1;i <= tot && 1ll * pri[j] * pri[j] <= w[i];++i) {
            ll tmp = w[i] / pri[j];
            int k;
            if(tmp <= m) k = id1[tmp];
            else k = id2[n / tmp];

            g[i] -= pri[j] * (g[k] - sum[j - 1]);
            h[i] -= h[k] - j + 1;
        }
    }

    // for(int i = 1;i <= tot;++i) printf("%lld ",h[i]);
    // puts("");
    // puts("!");
    cout<<Sphi(n,1) + 1 <<" "<<Smu(n,1) + 1<<endl;
    // puts("!!!");
}
int main() {
    int T = read();
    
    pre();

    while(T--) {
        n = read();solve();
    }

    return 0;
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這份資源是我經過多年積累才整理歸類出來,有很多電子書我覺質量還是非常高的,由於電子書太多我也是用業餘時間挑著看的,這麼多資源自己保存著也是浪費,就想著現在把資源分享出來,希望能真正幫到大家; 資源我都整理在網盤了,之前分享出來的鏈接沒過幾天就自動取消,我就在文章底部放了二維碼,需要的添加好友就行了, ...
  • 一、僅做瞭解 //用戶組的處理 public class TestUserGroup { private ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine(); //創建用戶和用戶組 @Test public voi ...
  • 流程中的某個任務由指定的group來完成,其中group由多個user組成。 一、直接指定辦理組 1、流程圖 2、部署和啟動流程 //部署流程 @Test public void bushu() { InputStream inputStream = this.getClass().getResou ...
  • 一、流程圖 二、分配個人任務的方式 1、直接指定辦理人 說明:這樣分配辦理人不夠靈活,因為項目開發中任務的辦理人不要放置在XML當中實際開發中辦理人是不固定的。 2、使用流程變數指定辦理人 2.1 流程圖中的設置 說明:在Activiti中#{username}和${username}的意義是一樣的 ...
  • 一、接收任務 接收任務(ReceiveTask)即等待任務,接收任務是一個簡單任務,它會等待對應消息的到達。當前,官方只實現了這個任務的java語義。 當流程達到接收任務,流程狀態會保存到資料庫中。在任務創建後,意味著流程會進入等待狀態,直到引擎接收了一個特定的消息, 這會觸發流程穿過接收任務繼續執 ...
  • Java JDBC 資料庫鏈接小結隨筆 一、鏈接資料庫的步驟 二、 關於Statement 和 PrepareStatement 兩者區別 用法 三、關於 ResultSet 的一些小結 四、自定義工具類的封裝 五、一些異常的解釋 一、鏈接資料庫的步驟 註冊驅動 獲得鏈接對象 創建sql容器 執行s ...
  • 簡介 Min_25篩~~據說~~可以在$O(\frac{n^{\frac{3}{4}}}{logn})$處理出含有以下性質的函數f的首碼和: 1.$f(ab)=f(a)f(b)$,即f是一個積性函數 2.$f(p^k)$可以快速計算。 PS:本文沒有關於複雜度的證明。。。 預處理 首先要預處理兩個東 ...
  • springboot集成開發實現商場秒殺 加入主要依賴 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependen ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...