Hillan and the girl —— 莫比乌斯对两个累加的优化

2024-04-07 01:18

本文主要是介绍Hillan and the girl —— 莫比乌斯对两个累加的优化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Problem Description
“WTF! While everyone has his girl(gay) friend, I only have my keyboard!” Tired of watching others’ affair, Hillan burst into scream, which made him decide not to hold it back.
“All right, I am giving you a question. If you answer correctly, I will be your girl friend.” After listening to Hillan, Girl replied, “What is the value of ∑ni=1∑mj=1f(i,j), where f(i,j)=0 if gcd(i,j) is a square number and f(i,j)=1 if gcd(i,j) is not a square number(gcd(i,j) means the greatest common divisor of x and y)?”
But Hillan didn’t have enough Intelligence Quotient to give the right answer. So he turn to you for help.

Input
The first line contains an integer T(1≤T≤10,000)——The number of the test cases.
For each test case, the only line contains two integers n,m(1≤n,m≤10,000,000) with a white space separated.

Output
For each test case, the only line contains a integer that is the answer.

Sample Input
2
1 2333333
10 10

Sample Output
0
33

Hint

In the first test case, obviously f(i,j) f ( i , j ) always equals to 0, because i i always equals to 1 and gcd(i,j) is always a square number(always equals to 1).

这个有两个玩意,所以它构造出来就是
sqrt(k)=1nf(k)= ∑ s q r t ( k ) = 1 n f ( k ) = k|pg(p)(p<=N) ∑ k | p g ( p ) ( p <= N )
然后用莫比乌斯反演就可以得出我们要求的是
k=1sqrt(n) ∑ k = 1 s q r t ( n ) k|pμ(p/k)f(p) ∑ k | p μ ( p / k ) ∗ f ( p )
而f(p)是在n,m中gcd=p的倍数所有数量,那么就等于
k=1sqrt(n) ∑ k = 1 s q r t ( n ) k|pμ(p/k)(n/p)(m/p) ∑ k | p μ ( p / k ) ∗ ( n / p ) ∗ ( m / p )
因为 μ(p/k) μ ( p / k ) 我们是可以预处理出来的,所以需要变换一下式子
p=1n(n/p)(m/p) ∑ p = 1 n ( n / p ) ∗ ( m / p ) k|pμ(p/k) ∑ k | p μ ( p / k )
n/p和m/p可以通过整数分块加速

#include<bits/stdc++.h>
using namespace std;
#define eps 1e-6
#define ll long long
int n,m;
const int maxn=1e7+5;
int nprime[maxn],prime[maxn],cnt,mu[maxn],sum[maxn];
void init()
{cnt=0;mu[1]=1;for(int i=2;i<maxn;i++){if(!nprime[i]){prime[++cnt]=i;mu[i]=-1;}for(int j=1;j<=cnt&&prime[j]*i<maxn;j++){nprime[prime[j]*i]=1;if(i%prime[j]==0){mu[i*prime[j]]=0;break;}mu[i*prime[j]]=-mu[i];}}for(int i=1;i<=sqrt(maxn)+eps;i++)for(int j=i*i;j<maxn;j+=i*i)sum[j]+=mu[j/i/i];for(int i=2;i<maxn;i++)sum[i]+=sum[i-1];
}
int main()
{int t;scanf("%d",&t);init();while(t--){scanf("%d%d",&n,&m);ll ans=0;int ne;if(n>m)swap(n,m);for(int i=1;i<=n;i=ne+1){int l=n/i,r=m/i;ne=min(n/l,m/r);ans+=(ll)(sum[ne]-sum[i-1])*l*r;}printf("%lld\n",(ll)n*m-ans);}return 0;
}

这篇关于Hillan and the girl —— 莫比乌斯对两个累加的优化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/881302

相关文章

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

Deepseek使用指南与提问优化策略方式

《Deepseek使用指南与提问优化策略方式》本文介绍了DeepSeek语义搜索引擎的核心功能、集成方法及优化提问策略,通过自然语言处理和机器学习提供精准搜索结果,适用于智能客服、知识库检索等领域... 目录序言1. DeepSeek 概述2. DeepSeek 的集成与使用2.1 DeepSeek API

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

Tomcat高效部署与性能优化方式

《Tomcat高效部署与性能优化方式》本文介绍了如何高效部署Tomcat并进行性能优化,以确保Web应用的稳定运行和高效响应,高效部署包括环境准备、安装Tomcat、配置Tomcat、部署应用和启动T... 目录Tomcat高效部署与性能优化一、引言二、Tomcat高效部署三、Tomcat性能优化总结Tom

C#比较两个List集合内容是否相同的几种方法

《C#比较两个List集合内容是否相同的几种方法》本文详细介绍了在C#中比较两个List集合内容是否相同的方法,包括非自定义类和自定义类的元素比较,对于非自定义类,可以使用SequenceEqual、... 目录 一、非自定义类的元素比较1. 使用 SequenceEqual 方法(顺序和内容都相等)2.

解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)

《解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)》该文章介绍了使用Redis的阻塞队列和Stream流的消息队列来优化秒杀系统的方案,通过将秒杀流程拆分为两条流水线,使用Redi... 目录Redis秒杀优化方案(阻塞队列+Stream流的消息队列)什么是消息队列?消费者组的工作方式每

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

MySQL不使用子查询的原因及优化案例

《MySQL不使用子查询的原因及优化案例》对于mysql,不推荐使用子查询,效率太差,执行子查询时,MYSQL需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响,本文给大家... 目录不推荐使用子查询和JOIN的原因解决方案优化案例案例1:查询所有有库存的商品信息案例2:使用EX