BZOJ2401 陶陶的難題I 尤拉函式 線性篩

2022-05-20 08:07:37 字數 1265 閱讀 6207

題意:求

,n<=1000000,t<=100000

題解:直接做是n*sqrt(n)的,顯然會tle,不過這題a和b都是迴圈到n,那麼就可以進行如下的神奇變換:

$\sum\limits_^n\sum\limits_^nlcm(i,j)=2*\sum\limits_^n\sum\limits_^ilcm(i,j)-\sum\limits_^ni$

是不是很神奇?然後繼續推即可。

設$f(i)=\sum\limits_\varphi()$,我們只需要現行篩出f即可。

我們依舊只考慮i是質數的情況,當i=p時,$f(i)=p^2-p+1$,當i=p^2時,$f(i)=p^4-p^3+p^2-p+1$,以此類推。

所以我們維護一下x的最小質因子出現的次數,然後線性篩即可。

還有,因為出題人喪病,此題爆long long。

#include #include #include using namespace std;

typedef long long ll;

const int n=1000000;

const ll p=1000000000000ll;

ll a,b;

int n,num,t;

int np[n+10],pri[n/10],phi[n+10];

ll g[n+10],h[n+10];

struct lll

lll(ll c)

lll(ll x,ll y)

lll operator + (const lll &x) const

lll operator - (const lll &x) const

void print()

}f[n+10];

inline ll rd()

while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();

return ret*f;

}int main()

h[i*p]=(ll)p*p-p+1;

g[i*p]=g[i]*h[i*p];

} }for(i=1;i<=n;i++) f[i]=lll(g[i]*i)+f[i-1];

t=rd();

while(t--)

return 0;

}

bzoj3467 Crash和陶陶的遊戲

就一篇題解 1.離線,建出atrie樹 b樹的倍增雜湊陣列,節點按照到根路徑字典序排序 2.處理a節點對應字首對應b中的極長可以匹配的區間。在父親節點區間內二分即可 3.更新答案 加入a點,找區間中b中已經出現點個數。樹狀陣列 加入b點,本質是b到根的字串放在trie最大匹配長度,二分,雜湊表存a樹...

BZOJ 3257 樹的難題

3257 樹的難題 time limit 10 sec memory limit 128 mb submit 56 solved 39 submit status discuss description 給出乙個無根樹。樹有n個點,邊有權值。每個點都有顏色,是黑色 白色 灰色這三種顏色之一,稱為一棵...

bzoj3257 樹的難題

description 給出乙個無根樹。樹有n個點,邊有權值。每個點都有顏色,是黑色 白色 灰色這三種顏色之一,稱為一棵三色樹。可愛的 alice覺得,乙個三色樹為均衡的,當且僅當,樹中不含有黑色結點 或者含有至多乙個白色節點。然而,給出的三色樹可能並不滿足這個性質。所以,alice打算刪去若干條邊...