1. 程式人生 > >[BZOJ4407]於神之怒加強版

[BZOJ4407]於神之怒加強版

題面戳我
Description
給下N,M,K.求
\[\sum_{i=1}^{n}\sum_{j=1}^{m}\gcd(i,j)^k\quad(mod\quad1e9+7)\]
Input
輸入有多組資料,輸入資料的第一行兩個正整數T,K,代表有T組資料,K的意義如上所示,下面第二行到第T+1行,每行為兩個正整數N,M,其意義如上式所示。
Output
如題
Sample Input
1 2
3 3
Sample Output
20
HINT
1<=N,M,K<=5000000,1<=T<=2000

sol

首先單組資料\(O(n)\)的都會噻,就不講了。(就是內外數論分塊\(O(\sqrt n*\sqrt n)=O(n)\)

的那種)
這種方法化到最後的答案式應該是
\[ans=\sum_{d=1}^{n}d^k\sum_{i=1}^{n/d}\mu(i)\lfloor\frac n{di}\rfloor\lfloor\frac m{di}\rfloor\]
我們現在令\(T=di\),然後考慮分別計算每一個\(\lfloor\frac nT\rfloor\lfloor\frac mT\rfloor\)對答案的貢獻
\[ans=\sum_{T=1}^{n}\lfloor\frac nT\rfloor\lfloor\frac mT\rfloor*\sum_{d|T}d^k\mu(\frac Td)\]
(手玩一下發現就是這樣的)
前面那一坨顯然還是\(O(\sqrt n)\)
分塊,後面那一坨發現是一個狄利克雷卷積的形式,就是說
\[h(T)=\sum_{d|T}d^k\mu(\frac Td)\]
是一個積性函式。所以線性篩出來後維護一個字首和即可。

code

這份程式碼比yyb的慢了整整一倍。
原因是我已經被int溢位給搞怕了所以全開long long(是全開!)
所以說如果你想像yyb 這種港記跑得一樣快的話請使用int型別並在適當的地方加上1ll*
我不會說我因為ans沒有清零WA了兩次的

#include<cstdio>
#include<algorithm>
using namespace std;
#define ll long long
const ll N = 5000005;
const ll maxn = 5000000;
const ll mod = 1e9 + 7;
ll gi()
{
    ll x=0,w=1;char ch=getchar();
    while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
    if (ch=='-') w=0,ch=getchar();
    while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
    return w?x:-x;
}
ll fastpow(ll a,ll b)
{
    ll s=1;
    while (b)
    {
        if (b&1) s=s*a%mod;
        a=a*a%mod;b>>=1;
    }
    return s;
}
ll t,k,n,m,pri[N],tot,zhi[N],low[N],h[N],ans;
void Mobius()
{
    zhi[1]=h[1]=low[1]=1;
    for (ll i=2;i<=maxn;i++)
    {
        if (!zhi[i]) low[i]=pri[++tot]=i,h[i]=(fastpow(i,k)-1+mod)%mod;
        for (ll j=1;j<=tot&&i*pri[j]<=maxn;j++)
        {
            zhi[i*pri[j]]=1;
            if (i%pri[j]==0)
            {
                low[i*pri[j]]=low[i]*pri[j];
                if (low[i]==i)
                    h[i*pri[j]]=h[i]*(h[pri[j]]+1)%mod;
                else
                    h[i*pri[j]]=h[i/low[i]]*h[low[i]*pri[j]]%mod;
                break;
            }
            low[i*pri[j]]=pri[j];
            h[i*pri[j]]=h[i]*h[pri[j]]%mod;
        }
    }
    for (ll i=1;i<=maxn;i++) h[i]=(h[i]+h[i-1])%mod;
}
int main()
{
    t=gi();k=gi();
    Mobius();
    while (t--)
    {
        n=gi();m=gi();ans=0;
        if (n>m) swap(n,m);
        ll i=1;
        while (i<=n)
        {
            ll j=min(n/(n/i),m/(m/i));
            ans=(ans+(h[j]-h[i-1]+mod)%mod*((n/i)*(m/i)%mod)%mod)%mod;
            i=j+1;
        }
        printf("%lld\n",ans);
    }
    return 0;
}

相關推薦

BZOJ4407: 加強

register 然而 script fin sin 什麽 load mil ati 4407: 於神之怒加強版 Time Limit: 80 Sec Memory Limit: 512 MBSubmit: 779 Solved: 368[Submit][Stat

BZOJ4407: 加強(莫比烏斯反演 線性篩)

idt col wap std break src cst line ace Description 給下N,M,K.求 感覺好迷茫啊,很多變換看的一臉懵逼卻又不知道去哪裏學。一道題做一上午也是沒誰了,, 首先按照套路反演化到最後應該是這個式子 $

[bzoj4407] 加強

Description 給出N,M,K.求 Input 輸入有多組資料,輸入資料的第一行兩個正整數T,K,代表有T組資料,K的意義如上所示,下面第二行到第T+1行,每行為兩個正整數N,M,其意義如上式所示。 Output 如題 Sample Input 1 2 3 3 Sample Ou

[BZOJ4407]加強-題解

【題目地址】 題意簡述 給定 T , K

[BZOJ4407]加強

題面戳我 Description 給下N,M,K.求 \[\sum_{i=1}^{n}\sum_{j=1}^{m}\gcd(i,j)^k\quad(mod\quad1e9+7)\] Input 輸入有多組資料,輸入資料的第一行兩個正整數T,K,代表有T組資料,K的意義如上所示,下面第二行到第T+1行,每行為兩

bzoj4407:加強

online digi spa ons 函數 swa 做了 如何 rim 傳送門 這個題真的也是有點難度啊(應該是因為我太菜了) \[ ans=\sum_{i=1}^{n}\sum_{j=1}^{m}gcd(i,j)^k\\] 可以設 \[ f(d)=\sum_{i=1}^

BZOJ4407加強

i++ algorithm tchar 積性函數 isdigit ffffff sdi prim end 題面 題目分析 \[ \begin{split} \sum\limits_{i=1}^n\sum\limits_{j=1}^mgcd(i,j)^k&=\sum

BZOJ 4407 加強

次方 由於 void end break blank zoj 鏈接 freopen 題目鏈接:於神之怒加強版   這個式子還是很妙的,只是我已經思維僵化了 \begin{aligned} &\sum_{i=1}^n\sum_{j=1}^m\gcd(i,j)^k \\

●BZOJ 4407 加強

ios eve floor min -- aps d+ post static 題鏈: http://www.lydsy.com/JudgeOnline/problem.php?id=4407 題解: 莫比烏斯反演 直接套路化式子 $\begin{align*}A

bzoj 4407 加強 (反演+線性篩)

ring cit std content gre png info 線性 += 於神之怒加強版 Time Limit: 80 Sec Memory Limit: 512 MBSubmit: 1184 Solved: 535[Submit][Status][Disc

BZOJ#4407. 加強

預處理 code line scrip scanf 約束 eight spa 只需要 4407: 於神之怒加強版 Time Limit: 80 Sec Memory Limit: 512 MBSubmit: 1302 Solved: 582 Descriptio

bzoj 4407 加強 —— 反演+篩積性函式

題目:https://www.lydsy.com/JudgeOnline/problem.php?id=4407 推導如這裡:https://www.cnblogs.com/clrs97/p/5191506.html 然後發現 \( F(D) \) 是一個積性函式,可以篩質數的同時篩出來; 首先,單個質

bzoj 4407 加強——反演

題目:https://www.lydsy.com/JudgeOnline/problem.php?id=4407 \( ans = \sum\limits_{D=1}^{min(n,m)}\frac{n}{D}*\frac{m}{D}\sum\limits_{d|D}d^{k}\mu (\frac{D}{d

bzoj 4407 加強 —— 反演+篩積性函數

targe ret scan 出現 space lse class cst www. 題目:https://www.lydsy.com/JudgeOnline/problem.php?id=4407 推導如這裏:https://www.cnblogs.com/clrs97/

加強

求 \[\sum_{i=1}^N\sum_{j=1}^M(i,j)^k\] 多組詢問,但是每次的\(k\)都是不變的 先是套路 \[f(n)=\sum_{i=1}^N\sum_{j=1}^M[(i,j)=n]\] \[F(n)=\sum_{n|d}f(d)=\left \lfloor \frac{N

P4449 加強 (莫比烏斯反演)

好的 its name bits sum namespace 更新 turn ans [題目鏈接] https://www.luogu.org/problemnew/show/P4449 給定n,m,k,計算 $\sum_{i=1}^n \sum_{j=1}^m \math

bzoj 4407: 加強【莫比烏斯反演+線性篩】

isp space names bre esp clas ios getch [1] 看著就像反演,所以先推式子(默認n<m): \[ \sum_{d=1}^{n}d^k\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)==d] \] \[ =\sum

Java成路(2018)

一、基礎篇 1. Java基礎知識 知識點 連結地址 Java快速入門 資源連結 IntelliJ IDEA教程 資源連結 JAVA程式設計思想指導 資源連結 Java8新特性 資源連結 2. Java Web 知識點 連結地址 Java Web進階:資料庫與My

深度搜索(加強)序號

        在之前基本款程式碼裡使用visited陣列來區分頂點,也就是visited[x]==true表示x頂點已經訪問過,visited[x]==false表示還沒訪問過x頂點。加強版中使用”顏色”來區分頂點,除此之外

Java成路(2018

一、基礎篇 1. Java基礎知識 知識點 連結地址 Java快速入門 資源連結 IntelliJ IDEA教程 資源連結 JAVA程式設計思想指