luogu五一 数学 day3 数学漫谈

求证:逆元的存在性

1570523145673

#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;
}

1570523454431

调和级数分析暴力复杂度

输入的时候开一个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的数据

1570523970659

1570524023354

自己推柿子

1570524174365

课后作业:古代猪文


求证: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)];

猜你喜欢

转载自www.cnblogs.com/sjsjsj-minus-Si/p/11636678.html