【2023ICPC网络赛I 】E. Magical Pair

在这里插入图片描述

当时在做洛谷U389682 最大公约数合并的时候我就想到把每个质因子分解出来然后跑高维前缀和,但是那一道题不是用这个方法,所有我也一直在思考这种做法是不是真的有用。因为昨天通过2024上海大学生程序设计竞赛I-六元组计数这道题我了解到了不少关于原根的性质,所以想着回来做去年网络赛的题目。因为我当时完全不了解原根,因此做不了这个题目,更看不懂题解,但是我现在已经大概掌握原根的知识,所以感觉做这道题还算比较轻松,而且这道题里面刚好就用到了曾经想到的质因数分解+高维前缀和,感觉十分有趣,于是写博客记录。

因为原根的题目一般都喜欢把0先处理掉,然后在处理不为0的情况。
很显然,如果想让左右两边为0,只需要满足 n ∣ x , n ∣ y n|x,n|y nx,ny,方案数为 ( n − 1 ) 2 (n-1)^2 (n1)2

然后我的想法是先列出一个 ( n − 1 ) ∗ ( n − 1 ) (n-1)*(n-1) (n1)(n1)的表, 1 < = x < = n − 1 , 1 < = y < = n − 1 , a i , j = i j 1<=x<=n-1,1<=y<=n-1,a_{i,j}=i^j 1<=x<=n1,1<=y<=n1,ai,j=ij。实际上,表上每一个位置都表示 n ∗ ( n − 1 ) n*(n-1) n(n1)个数,因为实际上它的行坐标可以加上若干个 n n n,列坐标可以加上若干个 n − 1 n-1 n1。然后就可以发现任意两个值相同的位置(可以一样)都恰好对应了一个解(我也不清楚如果以前没有看过题解能不能想到这一步)。比如两个坐标分别为 ( x 1 , y 1 ) , ( x 2 , y 2 ) (x_1,y_1),(x_2,y_2) (x1,y1),(x2,y2),如果我们想形成一个解,那么就必须要让 x 1 + k 1 n = y 2 + k 2 ( n − 1 ) , y 1 + k 3 ( n − 1 ) = x 2 + k 4 n x_1+k_1n=y_2+k_2(n-1),y_1+k_3(n-1)=x_2+k_4n x1+k1n=y2+k2(n1),y1+k3(n1)=x2+k4n,这个根据扩展欧几里得可以知道如果想找到另外一个解,那么 k 1 , k 4 k_1,k_4 k1,k4都必须改变 n − 1 n-1 n1 k 2 , k 3 k_2,k_3 k2,k3都必须改变 n n n,因此两个相同值的位置恰好对应一个解。

因此,我们就必须算出每个数出现的次数,答案就是这个出现次数的平方和。

根据原根的性质,和 n − 1 n-1 n1最大公因数相同的数出现次数一样, 然后我们就把和 n − 1 n-1 n1最大公因数相同的数全部在一个组,然后考虑组合组之间的影响(详见2024上海大学生程序设计竞赛I-六元组计数&原根知识详解。

我们就考虑每个集合的最小的数,那么只有它的因子所在的集合会出现这个数,实际上就是一个周期出现一次, g c d ( x , n − 1 ) = y gcd(x,n-1)=y gcd(x,n1)=y的数有 y y y个周期,所以贡献就是。

( n − 1 ) 2 + ∑ i ∣ n − 1 ϕ ( n − 1 i ) ( ∑ j ∣ i ϕ ( n − 1 j ) j ) 2 (n-1)^2+\sum_{i|n-1}\phi(\frac{n-1}{i})(\sum_{j|i}\phi(\frac{n-1}{j})j)^2 (n1)2+in1ϕ(in1)(jiϕ(jn1)j)2

我们可以预处理出 2 ∗ 1 0 7 2*10^7 2107以内的质数(实测表明n-1的所有素因子都不会超过4*10^14,所有我只用处理出这么多),然后分解完质因数就用高位前缀和把 ∑ j ∣ i ϕ ( n − 1 j ) j \sum_{j|i}\phi(\frac{n-1}{j})j jiϕ(jn1)j计算出来即可。

#include<bits/stdc++.h>
#define rep(i,x,y) for(int i=x;i<=y;i++)
#define dwn(i,x,y) for(int i=x;i>=y;i--)
#define ll long long
using namespace std;
template<typename T>inline void qr(T &x){
    x=0;int f=0;char s=getchar();
    while(!isdigit(s))f|=s=='-',s=getchar();
    while(isdigit(s))x=x*10+s-48,s=getchar();
    x=f?-x:x;
}
int cc=0,buf[31];
template<typename T>inline void qw(T x){
    if(x<0)putchar('-'),x=-x;
    do{buf[++cc]=int(x%10);x/=10;}while(x);
    while(cc)putchar(buf[cc--]+'0');
}
const int N=2e7+10,M=2e5+10,mod=998244353;
int cnt;ll p[N];bool v[N];
ll n,ans;
struct node{
    ll x,y;
}a[210];int m;ll val[210];
ll phi[M],lim,dp[M],num[M];
void solve(){
    qr(n);
    if(n==2){
        puts("2");
        return;
    }
    n--;ll nn=n;
    ans=(n%mod)*(n%mod)%mod;
    m=0;
    rep(i,1,cnt){
        if(p[i]*p[i]>n)break;
        if(n%p[i]==0){
            a[++m].x=p[i];
            a[m].y=0;
            while(n%p[i]==0)a[m].y++,n/=p[i];
        }
    }
    if(n>1)a[++m]=(node){n,1};
    val[1]=1;
    rep(i,2,m)val[i]=val[i-1]*(a[i-1].y+1);
    lim=val[m]*(a[m].y+1);
    rep(i,0,lim-1){
        if(!i){
            phi[i]=1;
            num[i]=1;
            continue;
        }
        bool bk=0;
        rep(j,1,m){
            ll t=i/val[j]%(a[j].y+1);
            if(t){
                if(t==1)phi[i]=phi[i-val[j]]*(a[j].x-1);
                else phi[i]=phi[i-val[j]]*a[j].x;
                num[i]=num[i-val[j]]*a[j].x;
                break;
            }
        }
    }
    rep(i,0,lim-1)dp[i]=(phi[lim-1-i]%mod)*(num[i]%mod)%mod;
    rep(i,1,m)
        rep(j,val[i],lim-1)
            if(j/val[i]%(a[i].y+1))
                (dp[j]+=dp[j-val[i]])%=mod;
    rep(i,0,lim-1){
        dp[i]=dp[i]*dp[i]%mod;
        (ans+=(phi[lim-1-i]%mod)*dp[i]%mod)%=mod;
    }
    cout<<ans<<endl;
}
int main(){
    rep(i,2,20000000){
        if(!v[i])v[i]=1,p[++cnt]=i;
        for(int j=1;j<=cnt&&i*p[j]<=20000000ll;j++){
            v[i*p[j]]=1;
            if(i%p[j]==0)break;
        }
    }
    int tt;qr(tt);
    while(tt--)solve();
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

平安养老险安徽分公司:助力乡村振兴 保险知识进农村

为深入宣传普及保险理念&#xff0c;进一步提升服务品质&#xff0c;营造“78全国保险公众宣传日”活动氛围&#xff0c;助力保险业健康稳定发展&#xff0c;近日&#xff0c;平安养老保险股份有限公司&#xff08;以下简称“平安养老险”&#xff09;安徽分公司走进安庆市宿松…

智能座舱相关问答

一、基本概念与理解 智能座舱的定义 回答&#xff1a;智能座舱是指在现代交通工具中&#xff0c;通过应用智能技术&#xff0c;实现对乘客座舱环境和服务进行智能化管理和优化的系统。它不仅提供更加舒适的乘坐体验&#xff0c;还能通过精确的数据分析和实时监控&#xff0c;提…

教育行业的网络安全:保护学生数据与防范网络欺凌

在数字化的春风中&#xff0c;教育行业迎来了知识的繁花似锦&#xff0c;然而&#xff0c;随之而来的网络安全风暴也悄然逼近。学生数据的脆弱性与网络欺凌的阴影交织成一幅复杂的画卷&#xff0c;呼唤着教育工作者与技术专家共同编织一张密不透风的网络安全之网。本文深入探讨…

A*——AcWing 178. 第K短路

A* 定义 A算法是一种广泛应用于路径搜索和图遍历的启发式搜索算法&#xff0c;它结合了最好优先搜索和Dijkstra算法的优点&#xff0c;旨在找到从初始节点到目标节点的最短路径。A算法在游戏AI、机器人导航、地图路线规划等领域有广泛应用。 A*算法的核心在于使用一个评估函…

React+TS前台项目实战(二十四)-- 全局常用绘制组件Qrcode封装

文章目录 前言Qrcode组件1. 功能分析2. 代码详细注释3. 使用方式4. 效果展示(pc端 / 移动端) 总结 前言 今天要封装的Qrcode 组件&#xff0c;是通过传入的信息&#xff0c;绘制在二维码上&#xff0c;可用于很多场景&#xff0c;如区块链项目中的区块显示交易地址时就可以用到…

顶顶通语音信箱手机助手拦截方案(mod_cti基于FreeSWITCH)

文章目录 前言联系我们拦截方案方案一&#xff1a;空号识别拦截拦截时间原理能够识别出的状态 方案二&#xff1a;实时质检拦截拦截时间原理拦截效果展示 服务器配置要求 前言 顶顶通拥有两种语音信箱手机助手拦截方案&#xff1a; 方案一&#xff1a;空号识别拦截&#xff0…

springboot接口防抖【防重复提交】

什么是防抖 所谓防抖&#xff0c;一是防用户手抖&#xff0c;二是防网络抖动。在Web系统中&#xff0c;表单提交是一个非常常见的功能&#xff0c;如果不加控制&#xff0c;容易因为用户的误操作或网络延迟导致同一请求被发送多次&#xff0c;进而生成重复的数据记录。要针对用…

成都百洲文化传媒有限公司电商服务的佼佼者

在当今这个数字化时代&#xff0c;电商已成为商业发展的核心动力之一。成都百洲文化传媒有限公司&#xff0c;作为一家专注于电商服务的领先企业&#xff0c;正以其卓越的服务质量和前瞻性的战略眼光&#xff0c;引领着电商行业的新潮流。 一、公司简介 成都百洲文化传媒有限公…

sssssssssssssssshare_ptrrrrrrrrrrrrrrrrrrrrrrrrr

智能指针——shared_ptr的原理及仿写 shared_ptr的原理及仿写 共享指针允许多个指针指向同一份数据&#xff0c;因为它使用了引用计数&#xff0c;每多一个指针指向这个数据&#xff0c;引用技术加一&#xff0c;每销毁一个指针&#xff0c;引用技术减一&#xff0c;如果引用计…

拓展欧几里得和裴蜀定理

裴蜀定理&#xff08;或贝祖定理&#xff09;说明了对任何整数a、b和它们的最大公约数d&#xff0c;关于未知数x和y的线性不定方程&#xff08;称为裴蜀等式&#xff09;&#xff1a;若a,b是整数,且gcd(a,b)d&#xff0c;那么对于任意的整数x,y,axby都一定是d的倍数&#xff0c…

【安全攻防】网络安全中的序列化与反序列

1.序列化与反序列化 首先要了解序列化与反序列化的定义&#xff0c;以及序列化反序列化所用到的基本函数。 序列化&#xff1a;把对象转换为字节序列的过程称为对象的序列化&#xff0c;相当于游戏中的存档。 PHP中的序列化函数serialize() **serialize()**函数用于序列化对…

jsqlparse工具拦截sql处理和拓展

前置知识 访问者模式 &#xff08;Visitor Pattern&#xff09;是一种行为设计模式&#xff0c;它允许你定义在不改变被访问元素的类的前提下&#xff0c;扩展其功能。通过将操作&#xff08;操作或算法&#xff09;从对象结构中提取出来&#xff0c;可以在不修改这些对象的前…

6.基于SpringBoot的SSMP整合案例-业务层开发

目录 1.业务层标准开发 1.1接口定义 1.2实现类定义 1.3测试类定义 1.4小结&#xff1a; 2.业务层快速开发 2.1使用MyBatisP1us提供有业务层通用接口(ISerivce)与业务层通用实现类(ServiceImpl),t> 接口定义&#xff1a; 实现类定义&#xff1a; 测试类&#xff1a; …

MergeBus封装模块

当模型有很多信号进行交互的时候&#xff0c;并且已经无法回避线条交叉的时候&#xff0c;我们会选择 From和Goto模块来提高模型的可读性&#xff0c;假如你拿到的模型如下图&#xff1a; 像不像芯片的电路&#xff0c;错综而复杂 该如何整理呢&#xff1f; 我相信有很多模型…

2024年移动手游趋势:休闲类手游收入逆势增长,欧美玩家成为主力

移动手游广告情报平台Sensor Tower近期发布的报告显示&#xff0c;从宏观数据来看&#xff0c;尽管2023年对于移动游戏市场来说是艰难的一年&#xff0c;无论是总下载量亦或是总收入都较去年有所下降&#xff0c;尤其是Google Play。但在总体下降的大趋势下&#xff0c;休闲游戏…

mac如何压缩视频大小不改变画质,mac怎么压缩视频软件

在数字时代&#xff0c;视频已成为信息传递和娱乐消遣的重要媒介。然而&#xff0c;视频带来的愉悦体验背后&#xff0c;是日益增长的存储和分享压力。大视频文件不仅占用大量存储空间&#xff0c;上传和下载也变得异常缓慢。那么&#xff0c;如何才能有效压缩视频&#xff0c;…

SAP中的 UPDATA TASK 和 BACKGROUND TASK

前言&#xff1a; 记录这篇文章起因是调查生产订单报工问题引申出来的一个问题&#xff0c;后来再次调查后了解了其中缘由&#xff0c;大概记录以下&#xff0c;如有不对&#xff0c;欢迎指正。问题原贴如下&#xff1a; SAP CO11N BAPI_PRODORDCONF_CREATE_TT连续报工异步更…

LoadRunner-Virtual User Generator组件学习(录制不上内容)

重点知识 LR工具是拿C写的&#xff0c;所以它的脚本默认也是C&#xff0c;但是最终生成的脚本不止是C&#xff0c;它是支持C和Java语言的&#xff0c;这个大家要清楚&#xff0c;对本身懂代码的就很友好&#xff0c;你了解java&#xff0c;那就可以把脚本改成java&#xff0c;…

不看后悔!国内AI大比拼的精彩看点全汇总

至2022年AI爆发后&#xff0c;在中国已催生了上千个AI产品。 这些产品涵盖了从头部大厂到高等院校&#xff0c;再到初创企业的广泛阵容。 如&#xff1a; 大厂&#xff1a;百度文心、阿里通义、腾讯元宝、字节豆包、讯飞星火等高校&#xff1a;清华大学、北京大学等初创&…