数论学习笔记
如题。
链接:https://h.hszxoj.com/d/hzoj/training/64ae62d5016fac9fb4da7086?uid=482
3336. cf1444A
小数学题。gxyz 上的很好A,但是 CF 上的数据确实超级大。
先判断 \(\displaystyle 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。。。
原来等比数列通项不支持取模。。。
推导:
\(\text{设 p 为质数,则}\)
$\text{易证:}A^B \text{ 的因数,可以看作是任意一个或多个 } \ p_i \ \text{ 除以任意一个或多个 }a_i $
\(\text{ 由乘法原理得, }A^B\text{ 的因数个数是:}\)
\(\text{显然(shj说的),}A^B\text{ 的因数和是:}\)
\(\text{考虑对每一个等比数列求和取模:}\)
\(\text{若}2 \mid k ,\)
\(\text{若}2 \nmid k ,\)
得解。
然后在需要取模的地方(幂运算、每次递归的\(sum(p,i)\))取个模就好了。
3338. poj2478 Farey Sequence
计算输出欧拉函数的前 \(n\) 项。
P123. 「NOIP2012」同余方程
用 \(ex \gcd\) 求解同余方程。
3340. 【模板】扩展欧拉定理
但是 \(b\) 太长怎么办?
那就快读的时候完成 \(b\) 的化简,即扩展欧拉定理。
然后幂运算的时候取模就行了。
完整链接:https://gxyzoj.com/d/hzoj/blog/481/658199fdb082af9540aebe8f#1702992381185
P1333. [bzoj3884]上帝与集合的正确用法
有意思的东西。
考虑扩展欧拉定理:
则可用递归求解。边界为 p==1 return 0
。
而且计算幂的时候必须用快速幂取模。
代码是这样的:
int f(int p)
{
if(p==1) return 0;
return binpow(2,f(euler(p))+euler(p),p);
}
P203. 倒酒
依然是采用 \(\text{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
依然是 \(\text{exgcd}\) ,但是 \(\text{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 的问题
小 * 数论题,写了一晚上加一节数学课。
$ \text{考虑 } n \text{ 的因数,有:}$
引理1:
设 \(n=d*x\) , \(i=d*y\),其中 \(d =\gcd(i,n)\) , 则:
证明:
假设 \(\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:
\(\text{若 }i|n\text{ ,则:}\)
证明:
设 \(n=d*x\) , \(i=d*y\), 则:
即证。
所以
此时,这道题已经拿到了 \(90\) 分,那么还要考虑优化:
引理3:
证明:同引理1
则可优化:
得解。但需要判断 \(i*i=n\) 的时候,会多算一次。