数论学习笔记

如题。

链接: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 !=0p<q ,然后再次统计答案 ans=max(ans,p/pow(q,cnt);

然后输出答案即可。

3337. poj1845 sumdiv

**数学题。浪费我整整2天时间,还去问了数竞大佬sjh。。。

原来等比数列通项不支持取模。。。

推导:

设 p 为质数,则

A=p1a1×p2a2×p3a3××pnan

   AB=(p1a1×p2a2×p3a3××pnan)B

                  =p1a1B×p2a2B×p3a3B××pnanB

易证:AB 的因数,可以看作是任意一个或多个  pi  除以任意一个或多个 ai

 由乘法原理得, AB 的因数个数是:

(a1+1)(a2+1)(a3+1)(an+1)

显然(shj说的),AB 的因数和是:

SUM=i=1n(i=0aipir)

考虑对每一个等比数列求和取模:

2k,

sum(p,k)=i=0kpi

        sum(p,k)=p0+i=1kpi

            sum(p,k)=p0+p1i=0k1pi

                           sum(p,k)=1+p×sum(p,k1)

2k,

sum(p,k)=i=0kpi

                 sum(p,k)=0k/2pi+k/2+1kpi

                              sum(p,k)=0k/2pi+pk/2+1×0k/2pi

                     sum(p,k)=0k/2×(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)

22222(222modφ(p)+φ(p))(modp)2(222modφ(p)+φ(p))2[(2(22modφ(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++)
{
// if(i==j) continue;
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=i=1n[i|n]×i×i=1n[gcd(i,n)=i]

引理1:

n=dx , i=dy,其中 d=gcd(i,n) , 则:

gcd(x,y)=1

证明:

假设 gcd(x,y)>1

则不妨设 x=jt ,y=kt ,即 gcd(x,y)=k,k>1

带入 n,i 得:

n=dx=djt

i=dy=dkt

易证:gcd(i,n)>d,与假设不符,即可证明引理1

引理2:

若 i|n ,则:

i=1n[gcd(i,n)=d]=i=1n[gcd(i,nd)=1]

证明:
n=dx , i=dy, 则:

gcd(i,n)=dgcd(i,dx)=dgcd(i,x)=1gcd(i,nd)=1

即证。

所以

ans=i=1n[gcd(i,nd)=1]ans=i=1nφ(nd)

此时,这道题已经拿到了 90 分,那么还要考虑优化:

引理3:

gcd(i,n)=gcd(ni,n)

证明:同引理1

则可优化:

ans=ii=1nφ(nd),i|nans=i=1nφ(nd)+ndi=1nφ(i),i|n

得解。但需要判断 ii=n 的时候,会多算一次。

posted @   ccjjxx  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示