数学数论专项练习 day 60
A
显然只需要考虑质因子。
首先
有三个及其以上那么最小的一个
B
考虑一个序列
设
则 Ans 设为
必然有对于每个
-
-
-
也就是要求
的指数相同等价于:
限制条件
但是限制条件
其实可以通过
类如
解出来之后呢,由于每个
嗯貌似可以高斯消元
然后取一组最小的解出来就好了
太TMD扯淡了这个题写起来
C
硬算指定死,不过因为
而且有
考虑设
考虑到这玩意是对勾函数,那么对于一个
现在还是
注意到对勾函数存在分界点,也就是
D
首先
那么考虑枚举
这东西疑似充要
E
拜谢粉方方,粉方方好闪
显然可以等效为
自然地除掉
也就相当于
同时除掉
类似地,也可以得出
则有:
类似地可以有
也有
不妨设
则显然有
所以给原同余式整体除掉
互质就可以求逆元了,同时也说明了
注意到后面的三元组个数与
可以暴力处理出来直接哈希表/map 回答询问即可。
F
显然你三个方向两个向外一个向内,所以向外的状态向向内的状态连边,则可以变成一颗二叉树,而原题等价于问两个点之间的距离,显然我们只需要求出 dep
和 lca
即可。
可以考虑倍增,显然我们可以在类似辗转相除法地计算
G
妙啊,是我不会的题
首先由于
可以得出
由于
这是一个判断无解的条件
那么我们设
一步很妙的就是拿出常数
那么就可以令
我们求解
则答案可以还原为
这是因为你给Excrt过程中的每个
则有:
可以看到我们利用乘法手段将整个同余式右侧化成了定值,则满足如上式子等价于满足
我们所需最小非负整数解
显然我们只需要枚举一个循环节,也就是
我们可以进行如下处理:
-
- 当
极大时(严格意义上讲 即可,为了方便编程不妨设inf=2e12
)
我们可以枚举
以内的整数作为 计算答案- 当
较小时,直接对 取模 的最小非负值(这时候 是可以存下的)
- 当
-
- 当
极大时,我们可以枚举 的整数作为 。 - 当
较小时,我们先取 取模 的最小非负值,然后枚举 的整数作为
- 当
这样的枚举策略显然可以保证有解就可以找到一组最小的合法解。
最后我们求出 998244353
的值之后,再求 998244353
意义下的逆元,计算答案即可。
那么问题就只剩下三个
- 求解
模 的值 - 求解
模998244353
的值 - 判断
是否的“极大的”
不妨设
注意到
同时由于
那么可以得到
所以我们筛掉
在这一步里,
至于筛掉质数这一步,不妨枚举 exgcd
求出
这一步的复杂度是不超过
-
时, 是 的质因子,此时 , 的循环节长度是这样的
只有不超过 个 -
时, 的循环节长度是 ,也就是有 个,根据调和级数的知识这必然不超过
通过这一步筛除质数后乘上所有剩下的 998244353
的值了,至于是否是极大的,在乘法过程中判断即可。
实现:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int inf=2e12,mod=998244353;
int Md=1,Mans=1,Mup=1,N,A,B,C,D;
int w[1050050],v[1050500];
int exgcd(int a,int b,int &x,int &y){
if(!b){
x=1,y=0;return a;
}
int d=exgcd(b,a%b,x,y);
int z=x;x=y,y=z-(a/b)*y;
return d;
}
signed main(){
// ios::sync_with_stdio(false);
cin>>N>>A>>B>>C>>D;
int g=__gcd(C,D);if(B%g){
cout<<"-1\n";return 0;
}
int SurA=A%g;A/=g;B/=g,C/=g,D/=g;
for(int i=0;i<N;++i)w[i]=C+D*i;
for(int i=2;i<=N;++i){
if(!v[i]){
int p=i;
for(int j=i;j<=N;j+=i)v[j]=1;
//x*p+y*d=-c
if(C%__gcd(p,D))continue;
int x,y;int d=exgcd(p,D,x,y);
int len=p/d;y=y*(-(C/d)%len)%len;
y=(y%len+len)%len;
int mx=0;
// cout<<p<<": ";
for(int k=y;k<N;k+=len){
int c=0;
// cout<<k<<" "<<C+D*k<<"\n";
while(w[k]%p==0)w[k]/=p,++c;
mx=max(mx,c);
}
while(mx--){
Md=Md*p%D;
Mans=Mans*p%mod;
if(Mup>inf/p)Mup=inf+1;
else Mup=min(Mup*p,inf+1);
}
}
}
for(int i=0;i<N;++i)if(w[i]>1){
Md=Md*(w[i]%D)%D;
Mans=Mans*(w[i]%mod)%mod;
if(Mup>inf/w[i])Mup=inf+1;
else Mup=min(Mup*w[i],inf+1);
// cout<<w[i]<<" "<<i<<"\n";
}
// cout<<"prepared\n";
Mup=min(Mup,inf+1);
int tmp=A*D-B*C;
if(Mup!=inf+1)tmp=(tmp%Mup+Mup)%Mup;
auto power=[&](int a,int b)->int{
a%=mod;
int ans=1;
while(b){
if(b&1)ans=ans*a%mod;
a=a*a%mod;b>>=1;
}
return ans;
};
// cout<<"pw "<<" "<<Md<<" "<<Mup<<' '<<Mans<<"\n";
for(int y=0;y<=D;++y){
// cout<<y<<"\n";
if(tmp<0&&y==0)continue;
if((tmp+y*Md%D)%D)continue;
// cout<<"Find\n";
int ans=(y*(Mans%mod)+tmp%mod)%mod;
ans=ans*power(D,mod-2)%mod;
ans=ans*g%mod;
ans=(ans+SurA)%mod;
cout<<ans<<"\n";return 0;
}
cout<<"-1\n";
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!