牛客多校9 - Groundhog Chasing Death(质因子分解+思维)

news2023/12/12 2:22:14

题目链接:点击查看

题目大意:给出 a , b , c , d , x , y ,求\prod_{i=a}^{b}\prod_{j=c}^{d}gcd(x^i,y^j)

题目分析:因为涉及到了 gcd 的乘积运算,那么易知不同质因子的贡献是相互独立的,首先我们就可以先将 x 和 y 进行质因子分解,那么对于质因子 p 来说,设 cntx[ p ] 为 p 在 x 中出现的次数,cnty[ p ] 为 p 在 y 中出现的次数,不难看出,需要这两个数同时大于 0 才有贡献,如果其中一者为 0 的话,那么其表示的质因子就是 p^0 = 1 ,gcd 求出来显然也就是 1 了,对答案没有贡献

到此,cntx[ p ] 和 cnty[ p ] 都大于 0 ,那么质因子 p 的 gcd 就是 gcd(p^{cntx[p]},p^{cnty[p]}),也就是 p^{min(cntx[p],cnty[p])},这也就提醒我们可以对指数单独处理,最后求一下 p 的幂次再乘起来就是答案了

此时我们可以对指数稍微打表找一下规律,打表程序如下(可以自己更改一下 i 和 j 的取值范围,分别代表 [ a , b ] 和 [ c , d ] ):

for(int k=1;k<=5;k++)//质因子p在x中的个数 
	for(int t=1;t<=5;t++)//质因子p在y中的个数 
	{
		printf("*****cntx:%d cnty:%d*****\n",k,t);
		for(int i=1;i<=5;i++)//a~b
		{
			for(int j=1;j<=5;j++)//c~d 
				printf("%d ",min(i*k,j*t));
			puts("");
		}
	}

这里不卖关子了,直接说规律:

  1. 当 i 确定时,[ c , d ] 的一列可以分为两段:
    1. 前半段为等差数列
    2. 后半段为常数
  2. 当 j 确定时,[ a , b ] 的一行可以分为两段:
    1. 前半段为等差数列
    2. 后半段为常数

这样就可以将 ( b - a + 1 ) * ( d - c + 1 ) 的时间复杂度优化为 ( b - a + 1 ) 或者 ( d - c + 1 ) 了,因为知道了是等差数列,我们可以求出三项:第一项,第二项,最后一项,根据第一项和第二项得出公差,根据第一项、最后一项和公差计算出等差数列的长度,这样最后常数项的长度也能计算得出了

有个小坑就是,如果指数直接进行运算的话,会爆 long long ,可以用费马小定理降幂,一方面是保证指数在数据范围内,另一方面是加速快速幂的运算

因为我用了 map 参与质因子分解,所以总的时间复杂度为 ( b - a + 1 ) * logn * logn

代码:
 

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#include<unordered_map>
using namespace std;

typedef long long LL;

typedef unsigned long long ull;

const int inf=0x3f3f3f3f;

const int N=1e5+100;

const int mod=998244353;

const int mmod=mod-1;

map<int,int>mpx,mpy;

LL q_pow(LL a,LL b)
{
	LL ans=1;
	while(b)
	{
		if(b&1)
			ans=ans*a%mod;
		a=a*a%mod;
		b>>=1;
	}
	return ans;
}

void only(map<int,int>&mp,int x)
{
	for(int i=2;i*i<=x;i++)
	{
		while(x%i==0)
		{
			mp[i]++;
			x/=i;
		}
	}
	if(x!=1)
		mp[x]++;
}

int main()
{
#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);
	int a,b,c,d,x,y;
	scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&x,&y);
	a=max(a,1);
	c=max(c,1);
	only(mpx,x),only(mpy,y);
	LL ans=1;
	for(auto it:mpx)
	{
		int num=it.first,cntx=it.second,cnty=mpy[num];
		if(cntx==0||cnty==0)
			continue;
		LL res=0;//指数 
		for(int i=a;i<=b;i++)
		{
			LL mmin=min(1LL*i*cntx,1LL*c*cnty),mmax=min(1LL*i*cntx,1LL*d*cnty);//第一项和最后一项
			LL delta=min(1LL*i*cntx,1LL*(c+1)*cnty)-mmin;//公差
			LL k=d-c+1;//一共有k项
			LL n;//有几项是等差数列
			if(delta==0)
				n=k;
			else
				n=(mmax-mmin)/delta+1;
			LL sum=(n*mmin%mmod+(n*(n-1)/2)%mmod*delta%mmod)%mmod;//等差数列求和公式
			res=(res+sum%mmod+1LL*(k-n)*mmax%mmod)%mmod;
		}
		ans=ans*q_pow(num,res)%mod;
	}
	printf("%lld\n",ans);






    return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dtcms.cn/news/show-830746.html

如若内容造成侵权/违法违规/事实不符,请联系七分地网进行投诉反馈,一经查实,立即删除!

相关文章

用WPF山寨折线图,抄?是狠狠的抄

对于没有美术细胞的我来说&#xff0c;抄袭人家的设计或是创意是再平常不过的事&#xff0c;我承认这很无耻&#xff0c;如果在伟大“天朝”的教育体系下还可能升级为道德上的沦丧&#xff0c;毕竟人家搞个东西也不容易&#xff0c;可任务在身&#xff0c;只好下策&#xff0c;…

PyCharm编写shell脚本无法运行

背景 我们常常选择使用PyCharm在本地&#xff08;Windows&#xff09;进行开发&#xff0c;然后将文件远程同步到远程服务器&#xff08;Linux&#xff09;运行程序&#xff0c;但是这样编写的shell脚本常常无法运行&#xff0c;出现语法错误&#xff0c;因为好几个朋友和我提…

返回局部变量或临时变量的地址_值传递和地址返回两者在堆区(Heap)应用的三种易错点...

1、指针变量作为参数进行值传递给函数的形参&#xff0c;并在堆区(Heap)进行内存分配和赋值程序源码&#xff1a;1 结果&#xff1a;Segmentation fault (core dumped)分析&#xff1a;如上图&#xff0c;指针变量ptr进行值传递给函数allocation()的形参tmp并赋值为NULL&#x…

微服务通信带来的问题

有了远程通信以后&#xff0c;我们势必会考虑几个问题 1. 目标服务肯定会做扩容&#xff0c;扩容以后&#xff0c;客户端会带来一些变化 2. 客户端对于目标服务如何进行负载均衡 3. 客户端如何维护目标服务的地址信息 4. 服务端的服务状态变化&#xff0c;如何让客户端尽心…

牛客多校10 - Tournament(找规律)

题目链接&#xff1a;点击查看 题目大意&#xff1a;现在有 n 个队伍参加比赛&#xff0c;任意两个队伍之间都要进行一次比赛&#xff0c;也就是共需要进行 n * ( n - 1 ) / 2 次比赛&#xff0c;对于每个队伍来说&#xff0c;必须要在第一场比赛的时候到达赛场&#xff0c;在…

Zend API: array_init

为什么80%的码农都做不了架构师&#xff1f;>>> array_init 和array_init_size 这2个看起来像是个函数其实这2个都是宏&#xff0c;具体定义在文件&#xff1a;zend_API.h 中。 #define array_init(arg) _array_init((arg), 0 ZEND_FILE_LINE_CC) #define array…

pvbrowser安装教程(Linux)

简介 pvbrowser是一款基于QT的开源组态软件开发框架&#xff0c;它为客户端计算机提供了一个专门的浏览器&#xff0c;并为创建实现可视化的服务器提供了一个集成开发环境。不过&#xff0c;官方文档对于pvbrowser开发环境的配置写的略微有点草率&#xff0c;本文给出Ubuntu下…

tensorflow官方文档_Tensorflow 2.0 Preview 官方文档

TensorFlow 2.0目前放出了Preview版本。目前想了解TensorFlow 2.0最快的方式就是查看官方API中的变化。本文列举一些从TF官方API中看出的TF 2.0的改进。TensorFlow 2.0 Preview可以通过pip下载了:CPU: https://pypi.org/project/tf-nightly-2.0-preview/GPU: https://pypi.org/…

Android ---- Context

Context字面意思上下文&#xff0c;位于framework package的android.content.Context中&#xff0c;很多方法需要通过  Context才能识别调用者的实例&#xff0c;比如说Toast的第一个参数就是Context&#xff0c;一般在Activity中我们直接用this代替&#xff0c;代表调用者的 …

Linux进程详细信息查看

我们通过ps及top系列命令查看进程信息时&#xff0c;只能看到命令执行的相对路径&#xff0c;查不到的进程的详细信息&#xff08;如绝对路径&#xff09;&#xff0c;那么这些信息到底如何查找呢&#xff1f; 其实&#xff0c;在Linux中&#xff0c;一切皆文本&#xff0c;那…

python操作json_如何使用Python处理JSON数据

如何使用Python处理JSON数据&#xff1f;本篇文章就给大家介绍使用Python处理JSON数据的基本方法。有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对你们有所帮助。 在介绍使用Python处理JSON数据的基本方法之前&#xff0c;我们首先要了解一下什么是J…

面试题——interleave

2019独角兽企业重金招聘Python工程师标准>>> <!-- lang: cpp --> /** *3个字符串a&#xff0c;b&#xff0c;c。判断c是否是a和b的interleave&#xff0c;也就是c中应该有a&#xff0c;b中所有字符&#xff0c; *并且c中字符顺序和a&#xff0c;b中一样。 *比…

corosync/openais+pacemaker+drbd+web实现高可用群集

拓扑图:配置前提&#xff1a; 1.节点的名字必须跟uname -n的名字相同&#xff0c;而且两个主机必须能通过主机名来访问。尽量不通过DNS来访问。时钟时间保持一样。 2.双方的通信要必须通过SSL的无障碍通信机制 3.双节点之间可以通过某个IP来提供连接&#xff0c;但是这只是通信…

0459-Repeated Substring Pattern(重复的子字符串)

这个系列算是出于个人兴趣开的一个新坑吧&#xff0c;最近看到同学刷LeetCode算法题&#xff0c;就想写写那些可以一行Python代码写出来的题目&#xff0c;因此本专栏的文章的解题方式效率不做保证&#xff0c;只为追求“一行的浪漫”。 题目 题解 简单解释一下题目&#xff0…

golang 反射_golang原理篇- nil:接口类型和值类型的区别

interface接口类型是golang的最重要的数据结构&#xff0c;底层是value和type组成&#xff0c;实现interface的struct的实例都能赋值给接口类型的变量&#xff0c;实现动态value的能力。type记录value的类型。int 3 的接口表示是(int, 3)&#xff0c;接口的零值是 (nil, nil)&a…

分布式一致性问题

什么是分布式一致性问题呢&#xff1f;简单来说&#xff0c;就是在一个分布式系统中&#xff0c;有多个节点&#xff0c;每个节点都会提出一个请求&#xff0c;但是在所有节点中只能确定一个请求被通过。而这个通过是需要所有节点达成一致的结果&#xff0c;所以所谓的一致性就…

can1--can初探

updating http://download.csdn.net/detail/songqqnew/4399668 http://download.csdn.net/detail/songqqnew/4399670http://download.csdn.net/detail/songqqnew/4399684mcp2515寄存器一览 几个寄存器名称及地址 TXBnCTRL——发送缓冲器n 控制寄存器&#xff08;地址&#xff1…

Michael Nygard on Building Resilient Systems

原文 InfoQ.Feature Complete Software 和 Production Ready Software是不同的。而很多时候&#xff0c;开发人员不清楚Production下的情况&#xff0c;所以没有很好的考虑到在Production下运行的情况。例如&#xff0c;在开发环境下&#xff0c;Sever A和Server B的压力是 1&…

python开发_tkinter_单选按钮

这篇blog主要是描述python中tkinter的单选按钮操作 下面是我做的demo 运行效果&#xff1a; 代码部分&#xff1a; 1 from tkinter import *2 3 # This is a demo program that shows how to4 # create radio buttons and how to get other widgets to5 # share the informat…

多继承有什么坏处,为什么java搞单继承,接口为什么可以摈弃这些坏处

2019独角兽企业重金招聘Python工程师标准>>> 多继承虽然能使子类同时拥有多个父类的特征&#xff0c;但是其缺点也是很显著的&#xff0c;主要有两方面&#xff1a; (1)如果在一个子类继承的多个父类中拥有相同名字的实例变量&#xff0c;子类在引用该变量时将产生歧…