The 2023 ICPC Asia Regionals Online Contest (1) E. Magical Pair(数论 欧拉函数)

news2025/1/11 2:13:38

题目

T(T<=10)组样例,每次给出一个n(2<=n<=1e18),

询问多少对(x,y)(0<=x,y<=n^2-n),满足x^y\equiv y^x(mod \ n)

答案对998244353取模,保证n-1不是998244353倍数

思路来源

OEIS、SSerxhs、官方题解

2023 ICPC 网络赛 第一场简要题解 - 知乎

题解

官方题解还没有补,OEIS打了个表然后就通过了

这里给一下SSerxhs教的做法吧(图源:我、tanao学弟)

SSerxhs代码

我的理解

首先,证一下这个和\sum_{i=0}^{p-2}b_{i}^2是等价的,其中bi为满足x^y\equiv i的(x,y)的对数

关于这部分,题解里给的中国剩余定理的构造,也很巧妙

剩下的部分就很神奇了,首先需要注意到各个素因子的贡献是独立的,可以连积

对于求某个素因子的幂次的贡献时,用到了解的分布是均匀的性质

代码1(OEIS)

#include<bits/stdc++.h>
using namespace std;
#define In inline
typedef long long ll;
typedef double db;
const int INF = 0x3f3f3f3f;
const db eps = 1e-8;
map<ll,ll>ans;
inline ll read()
{
    ll ans = 0;
    char ch = getchar(), last = ' ';
    while(!isdigit(ch)) {last = ch; ch = getchar();}
    while(isdigit(ch)) {ans = (ans << 1) + (ans << 3) + ch - '0'; ch = getchar();}
    if(last == '-') ans = -ans;
    return ans;
}
inline void write(ll x)
{
    if(x < 0) x = -x, putchar('-');
    if(x >= 10) write(x / 10);
    putchar(x % 10 + '0');
}
 
ll n;
 
In ll mul(ll a, ll b, ll mod) 
{
    ll d = (long double)a / mod * b + 1e-8; 
    ll r = a * b - d * mod;
    return r < 0 ? r + mod : r;
}
In ll quickpow(ll a, ll b, ll mod)
{
    ll ret = 1;
    for(; b; b >>= 1, a = mul(a, a, mod))
        if(b & 1) ret = mul(ret, a, mod);
    return ret;
}
 
In bool test(ll a, ll d, ll n)
{
    ll t = quickpow(a, d, n);
    if(t == 1) return 1;
    while(d != n - 1 && t != n - 1 && t != 1) t = mul(t, t, n), d <<= 1;
    return t == n - 1;                
}
int a[] = {2, 3, 5, 7, 11};
In bool miller_rabin(ll n)
{
    if(n == 1) return 0;
    for(int i = 0; i < 5; ++i)     
    {
        if(n == a[i]) return 1;
        if(!(n % a[i])) return 0;
    }
    ll d = n - 1;
    while(!(d & 1)) d >>= 1;
    for(int i = 1; i <= 5; ++i)   
    {
        ll a = rand() % (n - 2) + 2;
        if(!test(a, d, n)) return 0;
    }
    return 1;
}
 
In ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a;}
In ll f(ll x, ll a, ll mod) {return (mul(x, x, mod) + a) % mod;}
const int M = (1 << 7) - 1;     
ll pollard_rho(ll n)                   
{
    for(int i = 0; i < 5; ++i) if(n % a[i] == 0) return a[i];
    ll x = rand(), y = x, t = 1, a = rand() % (n - 2) + 2;
    for(int k = 2;; k <<= 1, y = x) 
    {
        ll q = 1;
        for(int i = 1; i <= k; ++i) 
        {
            x = f(x, a, n);
            q = mul(q, abs(x - y), n);
            if(!(i & M))   
            {
                t = gcd(q, n);
                if(t > 1) break;    
            }
        }
        if(t > 1 || (t = gcd(q, n)) > 1) break;  
    }
    return t;
}
In void find(ll x)
{
    if(x == 1 ) return;
    if(miller_rabin(x)) {ans[x]++;return;}
    ll p = x;
    while(p == x) p = pollard_rho(x);
    while(x % p == 0) x/=p;
    find(p); find(x);
}
const ll mod=998244353;
ll modpow(ll x,ll n){
	x%=mod;
	if(!x)return 0;
	ll res=1;
	for(;n;n>>=1,x=1ll*x*x%mod){
		if(n&1)res=1ll*res*x%mod;
	}
	return res;
}
ll cal(ll p,ll e){
	//printf("p:%lld e:%lld\n",p,e);
	return (modpow(p,e+1)+modpow(p,e)-1+mod)%mod*modpow(p,2*e-1)%mod;
}
int main()
{
    srand(time(0));
    int T = read();
    while(T--)
    {
    	ans.clear();
        n = read();
        ll m=n-1;
        find(m);
        ll phi=m%mod,res=1;
        for(auto &v:ans){
        	ll p=v.first,e=0;
        	while(m%p==0)m/=p,e++;
        	res=res*cal(p,e)%mod;
        }
        res=(res+phi*phi%mod)%mod;
        printf("%lld\n",res);
    }
    return 0;
}

代码2(SSerxhs代码)

#include<bits/stdc++.h>
using namespace std;
#define In inline
typedef long long ll;
typedef double db;
typedef pair<ll,int> P;
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
const int INF = 0x3f3f3f3f;
const db eps = 1e-8;
map<ll,int>ans;
vector<P>ans2;
inline ll read()
{
    ll ans = 0;
    char ch = getchar(), last = ' ';
    while(!isdigit(ch)) {last = ch; ch = getchar();}
    while(isdigit(ch)) {ans = (ans << 1) + (ans << 3) + ch - '0'; ch = getchar();}
    if(last == '-') ans = -ans;
    return ans;
}
inline void write(ll x)
{
    if(x < 0) x = -x, putchar('-');
    if(x >= 10) write(x / 10);
    putchar(x % 10 + '0');
}
 
ll n;
 
In ll mul(ll a, ll b, ll mod) 
{
    ll d = (long double)a / mod * b + 1e-8; 
    ll r = a * b - d * mod;
    return r < 0 ? r + mod : r;
}
In ll quickpow(ll a, ll b, ll mod)
{
    ll ret = 1;
    for(; b; b >>= 1, a = mul(a, a, mod))
        if(b & 1) ret = mul(ret, a, mod);
    return ret;
}
 
In bool test(ll a, ll d, ll n)
{
    ll t = quickpow(a, d, n);
    if(t == 1) return 1;
    while(d != n - 1 && t != n - 1 && t != 1) t = mul(t, t, n), d <<= 1;
    return t == n - 1;                
}
int a[] = {2, 3, 5, 7, 11};
In bool miller_rabin(ll n)
{
    if(n == 1) return 0;
    for(int i = 0; i < 5; ++i)     
    {
        if(n == a[i]) return 1;
        if(!(n % a[i])) return 0;
    }
    ll d = n - 1;
    while(!(d & 1)) d >>= 1;
    for(int i = 1; i <= 5; ++i)   
    {
        ll a = rand() % (n - 2) + 2;
        if(!test(a, d, n)) return 0;
    }
    return 1;
}
 
In ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a;}
In ll f(ll x, ll a, ll mod) {return (mul(x, x, mod) + a) % mod;}
const int M = (1 << 7) - 1;     
ll pollard_rho(ll n)                   
{
    for(int i = 0; i < 5; ++i) if(n % a[i] == 0) return a[i];
    ll x = rand(), y = x, t = 1, a = rand() % (n - 2) + 2;
    for(int k = 2;; k <<= 1, y = x) 
    {
        ll q = 1;
        for(int i = 1; i <= k; ++i) 
        {
            x = f(x, a, n);
            q = mul(q, abs(x - y), n);
            if(!(i & M))   
            {
                t = gcd(q, n);
                if(t > 1) break;    
            }
        }
        if(t > 1 || (t = gcd(q, n)) > 1) break;  
    }
    return t;
}
In void find(ll x)
{
    if(x == 1 ) return;
    if(miller_rabin(x)) {ans[x]++;return;}
    ll p = x;
    while(p == x) p = pollard_rho(x);
    while(x % p == 0) x/=p;
    find(p); find(x);
}
const ll mod=998244353;
ll modpow(ll x,ll n){
	x%=mod;
	if(!x)return 0;
	ll res=1;
	for(;n;n>>=1,x=1ll*x*x%mod){
		if(n&1)res=1ll*res*x%mod;
	}
	return res;
}
ll cal(ll p,ll e){
	//printf("p:%lld e:%lld\n",p,e);
	return (modpow(p,e+1)+modpow(p,e)-1+mod)%mod*modpow(p,2*e-1)%mod;
}
ll sol(){
	ll ta=1;//tt=1;
	for(auto &x:ans2){
		ll p=x.first,ans=0;
		int k=x.second;
		p%=mod;
		vector<ll> f(k+1),pw(k+1),num(k+1);
		pw[0]=1;
		rep(i,1,k)pw[i]=pw[i-1]*p%mod;
		rep(i,0,k-1)num[i]=(pw[k-i]+mod-pw[k-i-1])%mod;
		num[k]=1;
		rep(i,0,k){
			ll ni=num[i];
			rep(j,0,k){
				ll nj=num[j];
				f[min(k,i+j)]=(f[min(k,i+j)]+ni*nj%mod)%mod;
			}
		}
		rep(i,0,k){
			ll tmp=f[i]*modpow(num[i],mod-2)%mod;
			ans=(ans+tmp*tmp%mod*num[i]%mod)%mod;
		}
		ta=ta*ans%mod;
	}
	return ta;
}
int main()
{
    srand(time(0));
    int T = read();
    while(T--)
    {
    	ans.clear();
        ans2.clear();
        n = read();
        ll m=n-1;
        find(m);
        //ll phi=m%mod,res=1;
        for(auto &v:ans){
        	ll p=v.first,e=0;
        	while(m%p==0)m/=p,e++;
        	ans2.push_back(P(p,e));
        	//res=res*cal(p,e)%mod;
        }
        m=(n-1)%mod;
        ll res=sol();
        res=(res+m*m%mod)%mod;
        printf("%lld\n",res);
        //res=(res+phi*phi%mod)%mod;
        //printf("%lld\n",res);
    }
    return 0;
}

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

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

相关文章

【Springboot】整合Xxl-job

目录 一&#xff0c;下载1.1 官方文档地址1.2 源码仓库地址 二&#xff0c; 配置部署 "调度中心"2.1 初始化 "调度数据库"2.2 修改配置文件2.3 启动调度中心 三&#xff0c;springboot项目整合3.1 添加依赖3.2 修改配置文件3.3 执行器组件配置4.4 编写测试…

雷达编程实战之静态杂波滤除与到达角估计

雷达中经过混频的中频信号常常混有直流分量等一系列硬件设计引入的固定频率杂波&#xff0c;我们称之位静态杂波&#xff0c;雷达信号处理需要把这些静态杂波滤除从而有效的提高信噪比&#xff0c;实现准确的目标检测功能。 目标的到达角估计作为常规车载雷达信号处理的末端&am…

【数据结构】什么是数据结构?

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 数据结构的定义 数据结构(Data Structure)是计算机存储,组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合. 这么讲可能有些抽象,放一张图大家可能好理解一点…

Python 打印素数

"""打印素数介绍&#xff1a;素数是指只有两个正因数&#xff08;1和它本身&#xff09;的自然数&#xff0c;而且必须大于1。例如&#xff1a;2、3、5、7、11、13、17、19、23、29等等都是素数。小于2的数不是素数&#xff0c;因为它没有两个正因数。例如&…

编译原理龙书-词法分析

词法分析 词法分析器的作用 词法分析器的主要任务是读入源程序的输入字符&#xff0c;将它们组成词素&#xff0c;生成并输出一个词法单元序列&#xff0c;每个词法单元对应于一个词素 有时&#xff0c;词法分析器可以分成两个级联的处理阶段&#xff1a; 扫描阶段主要负责完…

Base64编码与打印标签(label)实例

文章目录 前言一、Base64 的简单认识二、Base64的使用场景三、 Base64的解码注意问题举个最近与后端配合的例子 四、 base64 转换为arrayBuffer&#xff0c;blod总结 前言 文件格式转换&#xff0c;在日常编程尤为常见&#xff0c;例如pdf文件大小的压缩存储&#xff0c;前端用…

Arduino驱动MMA7260三轴加速度传感器(惯性测量传感器篇)

目录 1、传感器特性 2、控制器和传感器连线图 3、驱动程序 Arduino驱动MMA7260三轴加速度传感器芯片,可以应用到摩托车和汽车放倒报警、遥控航模、游戏手柄、人形机器人跌倒检测、硬盘冲击保护、倾斜度测量等场合。 1

Java初级到中级:技术提升的策略与方法

文章目录 1 问题背景2 前言3 方法 1 问题背景 截至2023年7月&#xff0c;笔者已经毕业2年了&#xff0c;每天都在搬砖打螺丝&#xff0c;自我感觉需要沉淀、思考、总结一下。思考和总结一下如何从Java初级提升到Java中级&#xff0c;需要掌握一些什么方法论&#xff0c;有效地去…

使用命令行快速创建Vite项目

一、构建项目 在终端中使用如下命令行&#xff1a; npm create vite 二、定义项目名称 三、选择项目类型 Vanilla是我们常用的JavaScript&#xff0c;Vue和React是常用前端框架&#xff0c;可以根据自己的需要进行选择 通过上下键进行选择&#xff0c;按下回车进行确认 创建…

CMU15-445 format\clang-format\clang-tidy 失败

CMU15-445 format\clang-format\clang-tidy 失败 问题修改 问题 -- Setting build type to Debug as none was specified. -- Youre using Clang 14.0.0 CMake Warning at CMakeLists.txt:67 (message):BusTub/main couldnt find clang-format.CMake Warning at CMakeLists.tx…

VS2019创建GIt仓库时剔除文件或目录

假设本地有解决方案“SomeSolution” 1、首先”团队资源管理器“-“创建Git存储库”&#xff0c;选择“仅限本地”、“创建” VS会在解决方案目录下自动生成.gitattributes、.gitignore 2、编辑gitignore&#xff0c;直接拖到VS里或者用记事本打开。添加要剔除的文件或文件夹…

git --- 回滚 restore, reset, revert

git --- 回滚 restore, reset, revert git revertgit restoregit resetgit reset --softgit reset --mixedgit reset -- hard git revert git revert 是用于“反做”某一个版本&#xff0c;以达到撤销该版本的修改的目的也就是git revert会生成一个新的commit, 而这个commit需要…

Spring Cloud Alibaba快速整合OpenFeign

文章目录 spring cloud alibaba 整合OpenFeign整合流程1.导入依赖2. 编写调用接口2.1 service&#xff08;这里写的是clients&#xff09;2.2 controller 3.设置其最大链接时间3.1 配置文件3.2 client3.3 接口3.4 被访问的controller spring cloud alibaba 整合OpenFeign Fore…

C++之lseek64应用总结(二百三十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

基于STM32的宠物托运智能控制系统的设计(第十七届研电赛)

一、功能介绍 使用STM32作为主控设备&#xff0c;通过DHT11温湿度传感器、多合一空气质量检测传感器以及压力传感器对宠物的托运环境中的温湿度、二氧化碳浓度和食物与水的重量进行采集&#xff0c;将采集到的信息在本地LCD显示屏上显示&#xff0c;同时&#xff0c;使用4G模块…

IO模型学习

一、IO读写的基本原理 一个原则&#xff1a;操作系统将内存划分为两部分&#xff1a;一个是内核空间&#xff0c;一个是用户空间。在linux操作系统中&#xff0c;内核模块运行在内核空间&#xff0c;相应的进程处在内核态&#xff1b;用户程序运行在用户态&#xff0c;对应的进…

Vis.js教程(一):基础教程

1、Vis.js是什么 一个动态的、基于浏览器的可视化库。 该库的设计易于使用&#xff0c;能够处理大量动态数据&#xff0c;并能够对数据进行操作和交互。 该库由 DataSet、Timeline、Network、Graph2d 和 Graph3d 组件组成。 Vis.js官网&#xff1a;https://visjs.org/ github…

MS COCO数据集介绍以及pycocotools使用

MS COCO数据集介绍以及pycocotools使用 1、MS COCO数据集简介2、MS COCO数据集目录结构3、 MS COCO标注文件格式3.1 使用Python的json库查看3.2 使用官方cocoAPI查看 4、目标检测验证任务mAP 1、MS COCO数据集简介 2、MS COCO数据集目录结构 ├── coco2017: 数据集根目录├─…

Elasticsearch(Es搜索(简单使用、全文查询、复合查询)、地理位置查询、特殊查询、聚合操作、桶聚合、管道聚合)

Elasticsearch&#xff08;三&#xff09;——Es搜索&#xff08;简单使用、全文查询、复合查询&#xff09;、地理位置查询、特殊查询、聚合操作、桶聚合、管道聚合 一、Es搜索 这里的 Es 数据博主自己上网找的&#xff0c;为了练习 Es 搜索。 1、Elasticsearch 搜索入门 …

<十二>objectARX开发:Arx注册命令类型的含义以及颜色索引对应RGB值

1、注册命令类型 我们经常在acrxEntryPoint.cpp中看到注册命令如下: 那么各个宏定义代表什么意思呢? 主标识:(常用的) ACRX_CMD_MODAL: 在别的命令执行的时候该命令不会在其中执行。ACRX_CMD_TRANSPARENT: 命令可以再其它命令中执行,但在该标志下ads_sssetfirst()不能使…