如题。
链接:https://h.hszxoj.com/d/hzoj/training/64ae62d5016fac9fb4da7086?uid=482
3336. cf1444A
洛谷link
小数学题。gxyz 上的很好A,但是 CF 上的数据确实超级大。
先判断 q/p 是否成立,若不成立则直接 cout<<p;
否则就要遍历 q 的质因数,然后再找对应质因数中 q 含有的数量,记录ans=max(ans,p/pow(i,cntp-cntq+1);
之后再判断处理过的 q 是否大于一,如果是则再次用 p/q 直到p % q !=0 即 p<q ,然后再次统计答案 ans=max(ans,p/pow(q,cnt);
然后输出答案即可。
3337. poj1845 sumdiv
**数学题。浪费我整整2天时间,还去问了数竞大佬sjh。。。
原来等比数列通项不支持取模。。。
推导:
设 p 为质数,则
A=pa11×pa22×pa33×⋯×pann
AB=(pa11×pa22×pa33×⋯×pann)B
=pa1∗B1×pa2∗B2×pa3∗B3×⋯×pan∗Bn
易证:AB 的因数,可以看作是任意一个或多个 pi 除以任意一个或多个 ai
由乘法原理得, AB 的因数个数是:
(a1+1)(a2+1)(a3+1)⋯(an+1)
显然(shj说的),AB 的因数和是:
SUM=n∏i=1(ai∑i=0pri)
考虑对每一个等比数列求和取模:
若2∣k,
sum(p,k)=k∑i=0pi
sum(p,k)=p0+k∑i=1pi
sum(p,k)=p0+p1k−1∑i=0pi
sum(p,k)=1+p×sum(p,k−1)
若2∤k,
sum(p,k)=k∑i=0pi
sum(p,k)=k/2∑0pi+k∑k/2+1pi
sum(p,k)=k/2∑0pi+pk/2+1×k/2∑0pi
sum(p,k)=k/2∑0×(pk/2+1+1)
sum(p,k)=sum(p,k/2)×(pk/2+1+1)
得解。
然后在需要取模的地方(幂运算、每次递归的sum(p,i))取个模就好了。
3338. poj2478 Farey Sequence
计算输出欧拉函数的前 n 项。
P123. 「NOIP2012」同余方程
用 exgcd 求解同余方程。
3340. 【模板】扩展欧拉定理
ab≡{ab,b<φ(m)abmodφ(m)+φ(m),b≥φ(m)(modm)
但是 b 太长怎么办?
那就快读的时候完成 b 的化简,即扩展欧拉定理。
然后幂运算的时候取模就行了。
完整链接:https://gxyzoj.com/d/hzoj/blog/481/658199fdb082af9540aebe8f#1702992381185
P1333. [bzoj3884]上帝与集合的正确用法
有意思的东西。
考虑扩展欧拉定理:
ab≡{ab,b<φ(m)abmodφ(m)+φ(m),b≥φ(m)(modm)
222…2≡2(22…2modφ(p)+φ(p))(modp)2(22…2modφ(p)+φ(p))≡2[(2(2…2modφ(p′)+φ(p′)))modp′](modp)其中p′=φ(p)
则可用递归求解。边界为 p==1 return 0
。
而且计算幂的时候必须用快速幂取模。
代码是这样的:
| int f(int p) |
| { |
| if(p==1) return 0; |
| return binpow(2,f(euler(p))+euler(p),p); |
| } |
P203. 倒酒
依然是采用 exgcd 求解。但是有个小东西,我是看的题解的:
| x*=-1;a*=-1; |
| while(x<0||y<0) |
| { |
| x+=b/g*(x<0); |
| y-=a/g*(x>=0); |
| } |
就这样吧。
P129. 乘法逆元
你说的对,但是这道题用欧拉定理做的话要轻微卡常。

P124. [SDOI2008]仪仗队
依然是欧拉定理。先线性筛,再 for(int i=1;i<n;i++) ans+=(phi[i]*2);
然后输出 ans+1
。
P321. 荒岛野人Savage
依然是 exgcd ,但是 check 函数里面的一些东西我还是没理解。。。
高二再来填坑吧。
| bool ck(int m) |
| { |
| for(int i=1;i<=n;i++) |
| { |
| for(int j=i+1;j<=n;j++) |
| { |
| |
| x=0,y=0; |
| int a=p[i]-p[j],cc=c[j]-c[i]; |
| int g=exgcd(a,m); |
| if(cc%g) continue; |
| int b=m; |
| a/=g,b/=g,cc/=g; |
| b=abs(b); |
| x=(x*cc%b+b)%b; |
| if(x<=l[i]&&x<=l[j]) return 0; |
| } |
| } |
| return 1; |
| } |
P2303 [SDOI2012] Longge 的问题
小 * 数论题,写了一晚上加一节数学课。
考虑 n 的因数,有:
ans=n∑i=1[i|n]×i×n∑i=1[gcd(i,n)=i]
引理1:
设 n=d∗x , i=d∗y,其中 d=gcd(i,n) , 则:
gcd(x,y)=1
证明:
假设 gcd(x,y)>1
则不妨设 x=j∗t ,y=k∗t ,即 gcd(x,y)=k,k>1
带入 n,i 得:
n=d∗x=d∗j∗t
i=d∗y=d∗k∗t
易证:gcd(i,n)>d,与假设不符,即可证明引理1 。
引理2:
若 i|n ,则:
n∑i=1[gcd(i,n)=d]=n∑i=1[gcd(i,⌊nd⌋)=1]
证明:
设 n=d∗x , i=d∗y, 则:
gcd(i,n)=dgcd(i,d∗x)=dgcd(i,x)=1gcd(i,⌊nd⌋)=1
即证。
所以
ans=n∑i=1[gcd(i,⌊nd⌋)=1]ans=n∑i=1φ(⌊nd⌋)
此时,这道题已经拿到了 90 分,那么还要考虑优化:
引理3:
gcd(i,n)=gcd(n−i,n)
证明:同引理1
则可优化:
ans=in∑i=1φ(⌊nd⌋),i|nans=√n∑i=1φ(⌊nd⌋)+⌊nd⌋∗√n∑i=1φ(i),i|n
得解。但需要判断 i∗i=n 的时候,会多算一次。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!