bzoj 3309
奇怪的莫比乌斯反演...
题意:定义$f(n)$表示将$n$质因数分解后质因子的最高幂次,求$\sum_{i=1}^{a}\sum_{j=1}^{b}f(gcd(i,j))$
首先肯定是反演嘛...
推一发式子:
$\sum_{i=1}^{a}\sum_{j=1}^{b}f(gcd(i,j))$
$\sum_{i=1}^{a}\sum_{j=1}^{b}\sum_{d=1}^{min(a,b)}[gcd(i,j)\equiv d]f(d)$
$\sum_{d=1}^{min(a,b)}f(d)\sum_{i=1}^{a}\sum_{j=1}^{b}[gcd(i,j)\equiv d]$
$\sum_{d=1}^{min(a,b)}f(d)\sum_{i=1}^{\frac{a}{d}}\sum_{j=1}^{\frac{b}{d}}[gcd(i,j)\equiv 1]$
$\sum_{d=1}^{min(a,b)}f(d)\sum_{i=1}^{\frac{a}{d}}\sum_{j=1}^{\frac{b}{d}}\sum_{t=1}^{min(\frac{a}{d},\frac{b}{d})}\mu(t)$
$\sum_{d=1}^{min(a,b)}f(d)\sum_{t=1}^{min(a,b)}\mu(t)\frac{a}{dt}\frac{b}{dt}$
令$T=dt$,得到:
$\sum_{T=1}^{min(a,b)}\frac{a}{T}\frac{b}{T}\sum_{d|T}f(d)\mu(\frac{T}{d})$
于是我们只需线性筛后面那一坨,然后数论分块即可
考虑线性筛:
令$g(T)=\sum_{d|T}f(d)\mu(\frac{T}{d})$
设对$T$进行质因数分解,得到这样的式子:$T=\prod_{i=1}^{n}p_{i}^{k_{i}}$
分两类进行讨论:
①.对任意$i\in [1,n-1]$,有$k_{i}=k_{i+1}$
首先我们考虑那个卷积式子,由于有一项是$\mu$,因此我们只需考虑$\mu$里面的东西无平方因子的情况,也即对于每个质因子,要么选$1$个,要么不选!
然后我们考虑什么分法会产生贡献:
不难发现,我们取奇数个质因子和取偶数个质因子的方案数是一样的,而其$\mu$互为相反数,当且仅当我们选了所有质因子时其$f$与其余的$f$不同(这个$f$变成了$k_{i}-1$),因此我们只需知道这个$-1$与对应的$\mu$产生的是正贡献还是负贡献即可,最后结论是$g(T)=(-1)^{n+1}$
②.存在$i,j\in [1,n]$,使得$k_{i}!=k_{j}$
类比上面的分析方式,得到$g(T)=0$
这样就可以线性筛了
代码:
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#define ll long long
using namespace std;
int mu[10000005];
int pri[1000005];
int f[10000005],mi[10000005],val[10000005];
ll F[10000005];
bool used[10000005];
int cnt=0;
ll T,x,y;
void init()
{
mu[1]=1;
f[1]=0;
for(int i=2;i<=10000000;i++)
{
if(!used[i])mu[i]=-1,pri[++cnt]=i,mi[i]=f[i]=1,val[i]=i;
for(int j=1;j<=cnt&&i*pri[j]<=10000000;j++)
{
used[i*pri[j]]=1;
if(i%pri[j]==0)
{
mu[i*pri[j]]=0;
mi[i*pri[j]]=mi[i]+1;
val[i*pri[j]]=val[i]*pri[j];
ll temp=i/val[i];
if(temp==1)f[i*pri[j]]=1;
else f[i*pri[j]]=(mi[temp]==mi[i*pri[j]])?-f[temp]:0;
break;
}
mu[i*pri[j]]=-mu[i],mi[i*pri[j]]=1,val[i*pri[j]]=pri[j],f[i*pri[j]]=(mi[i]==1)?-f[i]:0;
}
}
for(int i=2;i<=10000000;i++)f[i]+=f[i-1];
}
ll solve(ll a,ll b)
{
ll las=1,ans=0;
for(int i=1;i<=a&&i<=b;i=las+1)
{
las=min(a/(a/i),b/(b/i));
ans+=(f[las]-f[i-1])*(a/i)*(b/i);
}
return ans;
}
template <typename T>inline void read(T &x)
{
T f=1,c=0;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){c=c*10+ch-'0';ch=getchar();}
x=c*f;
}
int main()
{
init();
read(T);
while(T--)
{
read(x),read(y);
printf("%lld\n",solve(x,y));
}
return 0;
}
bzoj 3309的更多相关文章
- ●BZOJ 3309 DZY Loves Math
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3309 题解: 莫比乌斯反演,线筛 化一化式子: f(x)表示x的质因子分解中的最大幂指数 $ ...
- bzoj 3309 反演
$n=p_1^{a_1}p_2^{a_2}…p_k^{a_k},p_i$为素数,定义$f(n)=max(a_1,a_2…,a_k)$. 给定a,b<=1e7求$\sum\limits_{i=1} ...
- BZOJ 3309: DZY Loves Math
3309: DZY Loves Math Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 761 Solved: 401[Submit][Status ...
- 【BZOJ 3309】DZY Loves Math
http://www.lydsy.com/JudgeOnline/problem.php?id=3309 \[\sum_{T=1}^{min(a,b)}\sum_{d|T}f(d)\mu(\frac ...
- BZOJ 3309 莫比乌斯反演
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=3309 题意:定义f(n)为n所含质因子的最大幂指数,求 $Ans=\sum _{i=1} ...
- bzoj 3309 DZY Loves Math——反演+线性筛
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3309 像这种数据范围,一般是线性预处理,每个询问 sqrt (数论分块)做. 先反演一番.然 ...
- bzoj 3309 DZY Loves Math —— 莫比乌斯反演+数论分块
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3309 凭着上课所讲和与 Narh 讨论推出式子来: 竟然是第一次写数论分块!所以迷惑了半天: ...
- 数学(数论)BZOJ 3309:DZY Loves Math
Description 对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0. 给定正整数a,b, ...
- BZOJ 3309: DZY Loves Math [莫比乌斯反演 线性筛]
题意:\(f(n)\)为n的质因子分解中的最大幂指数,求\(\sum_{i=1}^n \sum_{j=1}^m f(gcd(i,j))\) 套路推♂倒 \[ \sum_{D=1}^n \sum_{d| ...
- 【bzoj 3309 】 DZY Loves Math
Description 对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0.给定正整数a,b,求 ...
随机推荐
- NGINX websocket 配制
http { map $http_upgrade $connection_upgrade { default upgrade; '' close; } upstre ...
- 在windows上搭建spark遇到的问题
报错如下: The root scratch dir: /tmp/hive on HDFS should be writable. Current permissions are: --------- ...
- Java Swing 防止键入手Key 的实现方法
实现思路,启动一个线程每隔0.1秒去比较文本里字符长度变化,如果文本变长了,这个情况间隔时间超过2秒,则认为是人工键入. 对于字符串较多,且包含数字和字母的情况,比较适用. class KeyCode ...
- Javascript格式化数字字符串,如手机号,银行卡号的格式化
手机号13312341234转化成133 1234 1234 //方式一 function format_tel(tel){ tel = String(tel); return tel.replace ...
- C# RGB转Brush
C#中自定义一个Brush,使用Color赋RGB值给Brush: dataGrid2.HorizontalGridLinesBrush = new SolidColorBrush(System.Wi ...
- SDIO接口WIFI&BT之相关常备知识
SDIO接口WIFI&BT之相关常备知识 <VBAT>:>Main Power Voltage Soure Input 主电源输入(SDIO WIFI目前知道的都是 ...
- redis geo 做距离计算排序分页
redis geo 做距离计算排序分页 // 添加经纬度和店铺id geoadd store_list lng lat store_id 计算距离排序和生成临时文件 georadius store_l ...
- Dynamics 365 如何代表其他用户发送邮件
举个例子,用户A和用户B,用户B在新建电子邮件时,发件人以用户A的身份去发送邮件,这个时候需要做如下配置才可以. 首先登录用户A,在高级设置->个人设置中,配置允许其他人代表自己发送电子邮件. ...
- String intern的理解
String s1 = "Programming"; s1在栈内存中,Programming在常量池中. String s2 = new String("Progra ...
- ref、reactive、toRef、toRefs使用与区别
reactive 传参:reactive(arg),arg只能是对象 arg为普通对象 返回响应式对象,不管层级多深,都能响应 使用:获取数据值的时候直接获取,不需要加.value 特点:解构.扩展运 ...