1. 程式人生 > >[min25篩學習小記]LOJ6053

[min25篩學習小記]LOJ6053

min25篩

解決一類積性函式求字首和問題,主旨為模擬普通篩法過程。
假設我們要求i=1..nF(i)
一般來說,能做的題,F(p)可表示為p相關的多項式,其中p為質數,下面將以F(p)=pk為例。
也即統計iik
為了方便做,我們先做出所有質數的f和。怎麼做呢?
g(x,i)=j=2..nF(j)[jpi]
其中pi表示從小到大第i個質數。g的含義就是,你用帶log的篩法去做,現在暫時排除掉前i個質數的倍數的f和。
和原始篩法一樣,注意到,n以內的合數,必定存在

n的質因子,那麼i最大取到根號的位置,這時就把所有質數的F和求出來了。
轉移:
g(x,i)=g(x,i1)pik(g(xpi,i1)sum[i1]).
而如果pi2>x,後面部分可以略去。
其中sum[i]表示的是前i個質數的F和,這個可以預處理。
這個式子的含義是,在前i-1個質數篩去合數結果的基礎上,再用pi篩,你把要篩的數除去pi,顯然剩下不能有小於pi的質因子。g狀態比較多,用遞推會比較快。

再考慮怎麼把所有的數都算上。

S(x,i)=j=2..nF(i)[jpi]
和g相反,我們要從大的i推到小的i。
質數部分,由g求出來。對於合數,列舉每個數的最小質因子及其次冪來轉移:
S(x,i)=(g(x,mx)sum[i1])+pjpie=1..logpjxF(pjk)S(xpje,j+1)+F(pjk+1)
mx為能取到的最大的質數。
然後玄學地,S直接轉移不用記憶化,跑得非常快,1s可以過1e10的n;而g則需要遞推來寫,而不是雜湊,才能過1e10。

LOJ6053

考慮直接套公式即可。

程式碼

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<map>
#include<set>
using namespace std;
typedef long long ll;
typedef double db;
#define fo(i,j,k) for(i=j;i<=k;i++)
#define fd(i,j,k) for(i=j;i>=k;i--)
#define cmax(a,b) (a=(a>b)?a:b)
#define cmin(a,b) (a=(a<b)?a:b)
const int N=2e5+5,M=1e6+5,mo=1e9+7;
ll pd[M],pri[M],spr[M],sprf[M];
ll val[N],g0[N],g1[N],id[2][N],pt,sn,n,nn,tt,i,j,v,upb,kan;
void predo(ll n)
{
    ll i,j,t;
    fo(i,2,n)
    {
        if (!pd[i])
            pri[++pri[0]]=i;
        fo(j,1,pri[0])
        {
            if (1ll*i*pri[j]>n) break;
            t=i*pri[j];
            pd[t]=1;
            if (i%pri[j]==0) break;
        }
    }
    fo(i,1,pri[0]) spr[i]=(spr[i-1]+pri[i])%mo;
    fo(i,1,pri[0]) sprf[i]=(sprf[i-1]+pri[i]+((i==1)?1:-1))%mo;
}
void sieve_g()
{
    sn=trunc(sqrt(n));
    tt=0;
    i=1;
    while (i<=n)
    {
        v=n/i;
        j=n/v;
        g0[++tt]=(v-1)%mo;
        g1[tt]=(v%mo*(v%mo+1ll)/2ll-1ll)%mo;
        val[tt]=v;
        if (v<=sn) id[0][v]=tt;else id[1][i]=tt;
        i=j+1;
    }
    fo(upb,1,pri[0]) if (!(n/pri[upb]/pri[upb])) break;
    upb--;
    fo(j,1,upb)
    {
        while (tt&&!(val[tt]/pri[j]/pri[j])) tt--;
        fo(i,1,tt)
        {
            pt=val[i]/pri[j];
            if (pt<=sn) pt=id[0][pt];else pt=id[1][n/pt];
            g0[i]=(g0[i]-g0[pt]+(j-1))%mo;
            g1[i]=(g1[i]-(g1[pt]-spr[j-1])*pri[j])%mo;
        }
    }
}
ll S(ll n,ll x)
{
    if (n<pri[x]||n<=1) return 0;
    if (n<=sn) pt=id[0][n];else pt=id[1][nn/n];
    ll ret=(g1[pt]-g0[pt]+2-sprf[x-1])%mo,prod;
    ll i,k;
    fo(i,x,pri[
            
           

相關推薦

[min25學習小記]LOJ6053

min25篩 解決一類積性函式求字首和問題,主旨為模擬普通篩法過程。 假設我們要求∑i=1..nF(i)∑i=1..nF(i)。 一般來說,能做的題,F(p)可表示為p相關的多項式,其中p為質數,下面將以F(p)=pkF(p)=pk為例。 也即統計∑ii

min_25 學習小記

終於在9102年之前搞完了這個東西。。 關於min_25篩,一種常數和寫法優於洲閣篩的神奇篩法,複雜度大概是 O (

min_25學習小記

終於在考試中碰到了一題不能用杜教篩的函式,被迫來學這個。。。 概述 首先這個函式f(x)f(x)要求是積性函式,而且f(p)f(p)和f(pc)f(pc)都要很好計算,設一個“假的”f′(x)f′(x)表示把xx直接當成質數時的f(x)f(x),f′

學習筆記」Min25

前言 M i n 25

yarn 學習 小記

webp 清除 style conf comm project yarn info lin 官網:https://yarnpkg.com/zh-Hans/docs/installing-dependencies 簡介:包管理工具,和npm類似主要特點:快速、安全、可靠  快

selenium學習小記

statement from 都沒有 mat load 發現 runtest 打開 stat selenium用於頁面自動化測試,其簡介雲雲這裏不再粘來粘去的贅述,浪費時間。下面說說自己遇到的一點小問題,及其處理方法。 一:selenium安裝   安裝方法,百度一下,相比

學習小記:JS判斷時特殊值與boolean類型的轉換

ring something mbo true mage js框架 temp some .info 扒開JQuery以及其他一些JS框架源碼,常常能看到下面這樣的判斷, 寫慣了C#高級語言語法的我,一直以來沒能系統的理解透這段代碼。 var test; //do

Python學習小記

hang class 字典 code col shang alice hone sha 字典: 1. 1 people = { 2 ‘Alice‘:{ 3 ‘phone‘: ‘111‘, 4 ‘addr‘: ‘shangha

二維最小乘積生成樹學習小記

轉化 div 求解 idt pla 學習 right log inf Preface   對於形如給定一些邊,其邊權為xi和yi,構造一個生成樹,使得   我們稱這棵樹,為最小乘積生成樹。我們可以考慮,沿用最小生成樹的思想,把這種新穎的最小生成樹做對。 Conte

枚舉enum學習小記

AI 兩個 有關 pri AC 聲明變量 文件 參數 lis 參考文獻: [1]C++程序設計語言(特別版), 裘宗燕譯, 機械工業出版社 [2]C++ Primer (3rd Ed.), S.B. Lippman and J. Lajoie, 人民郵電出版社 1、枚舉

【2018/04/02】學習小記

webp style pac error 進度條 成功 .config lB lba 復習了webpack的一些基礎~ --progress 帶進度條 --watch 使用緩存 --colors 醒目標記 node_modules本地最好自己有一份(~ ̄(OO) ̄)ブ,要不

胡小兔的杜教學習筆記

求解 init 了解 define esp spa warning 它的 prime 好久沒寫數論題,今天在51nod抓了一道,發現自己早就把杜教篩忘得一幹二凈啦~ 所以今天我把杜教篩學習筆記整理一下,防止以後再次忘記 =v= [Warning] 杜教篩復雜度證明我暫時還不

無監督學習小記(參考)

廣泛 個數 就是 sca 協方差矩陣 ear 元素 約束 方法 下面淩亂的小記一下無監督學習 無監督學習->聚類 降維 聚類:數據相似性 相似性的評估:兩個數據樣本間的距離 距離:歐氏距離 曼哈頓距離 馬氏距離 夾角余弦 sklearn 聚類算法 sklearn.cl

java集合類學習小記

lse 實例 hash 如果 集合 常用 遍歷 保存 bject 【List接口】:可變數組,允許保存所有類型元素,包括null,元素可重復,按添加順序保存【常用實現類】:建議用ArrayListArrayList:索引訪問速度快(但插入和刪除節點較慢)LinkedList

啟發式合並(堆、set、splay、treap)/線段樹合並學習小記

排序 需要 操作數 所有 class 兩個 因此 ext pan 啟發式合並 剛聽到這個東西的時候,我是相當蒙圈的。特別是“啟發式”這三個字莫名的裝逼,因此之前一直沒有學。 實際上,這個東西就是一個SB貪心。 以堆為例,若我們要合並兩個堆a、b,我們有一種極其簡單的做法:

BTM學習小記

color lda col src ram pen 估計 param sel BTM的原理跟LDA很像,下面是該模型的概率圖: 由該圖可以看出來,與LDA的區別在於確定主題分布和詞分布後相應地取兩個詞(而LDA只取一個,即類比常見的骰子說法:先投擲K面的骰子得到主題z,再

es學習小記

在學習es的過程中留下腳印方便之後複習 學習地址http://lib.csdn.net/wojiushiwo987/structure/deep_elasticsearch/node/17523615 十大恨招:https://blog.csdn.net/laoyang360/article

Python學習小記(1)

1.import問題 λ tree /F 卷 Programs 的資料夾 PATH 列表 卷序列號為 BC56-3256 D:. │ fibo.py │ ├─fibo │ │ __init__.py │ │ │ └─__pycache__ │ __init__.cpytho

Python學習小記(2)---[list, iterator, and, or, zip, dict.keys]

1.List行為 可以用 alist[:] 相當於 alist.copy() ,可以建立一個 alist 的 shallo copy,但是直接對 alist[:] 操作卻會直接操作 alist 物件

Python學習小記(3)---scope&namespace

def strong pam ner fine 影響 global 可見 Matter 首先,函數裏面是可以訪問外部變量的 #scope.py def scope_test(): spam = ‘scope_test spam‘ d