luogu五一 数学 day3 数学漫谈
求证:逆元的存在性
#include<bits/stdc++.h>
using namespace std;
int main(){
rd(a),rd(b),rd(c),rd(d);
//lcm(a*d,b*c)
printf("%lf",(a*b*c*d/__gcd(a*d,c*d))/(b*d));
return 0;
}
调和级数分析暴力复杂度
输入的时候开一个buck[x]++;
dwn(d,1000000,1)
判断d的倍数的个数是否>=k,并输出第一个满足条件的d
枚举rep(i,1,n/d)cnt+=w[d*i];
if(cnt>=k){
printf("%d",d);
exit(0);
}
复杂度分析
枚举每个d的复杂度是O(n/d)
的,总复杂度:
n/(10w)+n/(10w-1)+n/(10w-2)+...+n/2+n/1
根据调和级数,复杂度为O(nlogn)
,可以通过本题1e6的数据
自己推柿子
课后作业:古代猪文
求证:gcd(f[n],f[m])==f[gcd(n,m)];
引理1:
Gcd(F[n+1],F[n])=1;
证明:
根据辗转相减法则
Gcd(F[n+1],F[n])
=gcd(f[n+1]-f[n],f[n])
=gcd(f[n],f[n-1])
.
.
.
=gcd(f[2],f[1])
=1
引理2:
f[m+n]=f[m-1][n]+f[m][n+1]
证明:
f[n+m]
=f[n+m-1]+f[n+m-2]
=2*f[n+m-2]+f[n+m-3]
=...
设
f[n+m]=a[x]*f[n+m-x]+b[x]*f[n+m-x-1];
= (a[x]+b[x])*f[n-m-x-1]+a[x]*f[n+m-x-2];
当x=1时有 a[1]=f[2]; b[1]=f[1];
当x=2时有 a[2]=f[2]+f[1]=f[3]; b[2]=a[1]=f[2];
当x=k+1时有
a[k+1]=a[k]+b[k]=f[k+1]+f[k]=f[k+2]
b[k+1]=a[k]=f[k+1];
所以当x=n时有
F[n+m]=a[n]*F[m]+b[n]*F[m-1];
=f[n+1][m]+f[n][m-1];
引理3:
gcd(f[n+m],f[n])==gcd(f[n],f[m])
证明:
gcd(f[n+m],f[n])
=gcd(f[n+1]*f[m]+f[n]*f[m-1],f[n])
=gcd(f[n+1]*f[m],f[n])
=gcd(f[n+1],f[n])*gcd(f[m],f[n])
=gcd(f[m],f[n]);
于是显然有:Gcd(F[n],F[m])=F[Gcd(n,m)];