1.11

发布时间 2024-01-11 21:20:11作者: HS_xh

昨天体侧测了 1000 米,因为之前下大雪一个月没怎么上体育,然后导致我体质变得很差,然后就只跑了 3 分 40,恼了。

风太大,起跑的时候没跟上人后面都是自己一个人跑,没人给我挡风,再加上周一练立定跳远把腿拉伤了,现在还疼,这种种因素下我认为我估计连进 4 分都难,结果 3 分 40 还是挺高兴的。

明天就是周五了又能看见她了 ???

emoji 恶心


超能粒子炮·改

题意是求 \(\sum_{i=0}^{k}\dbinom{i}{n}\%p\)

开始推,首先根据 Lucas 定理

\[\sum_{i=0}^{k}\dbinom{i}{n}=\sum_{i=0}^{k}\dbinom{i\%p}{n\%p}\times \dbinom{i/p}{n/p}\%p \]

由于 \(i/p\)\(n/p\) 许多时候值相等,所以记

\[f[i]=\sum_{i=0}^{j}\dbinom{i\%p}{n\%p}\%p \]

预处理出 \(f\) 数组,但是仍然会 TLE

原因是我们在求 \(ans\) 时,需要这么写

for(;k<=m-p;k+=p) ans=(ans+f[n%p][n%p]*Lucas(n/p,k/p))%p;

这样写复杂度逆天,肯定是过不了啊。

所以我们提出 \(f[n\%p][n\%p]\),就有

\[\sum_{i=0}^{m/p}\dbinom{i}{n/p} \]

然后发现可以递归求这个玩意

定义

\[F(i,j)=f[n\%p][n\%p]\times F(\frac np,\frac mp-1)+Lucas(\frac np,\frac mp)\times f[n\%p][min(n\%p,m\%p)] \]

然后就能求了

洛谷上交总是 40 分,发现原因竟然是递归函数写错了,这怎么拿的 40 ???

Code
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define N 4001
#define p 2333
inline int read()
{
    int s = 0,w = 1;char ch = getchar();
    while(ch<'0'||ch>'9'){ if(ch == '-') w = -1;ch = getchar();}
    while(ch>='0'&&ch<='9'){ s = s*10+ch-'0';ch = getchar();}
    return s*w;
}
int n,m,c[N][N],f[N][N];
inline void inv(int &x)
{
    while(x<0) x+=p;
    while(x>=p) x-=p;
}
inline int Lucas(int n,int m)
{
    if(m==0) return 1;
    return c[n%p][m%p]*Lucas(n/p,m/p)%p;
}
inline int F(int n,int m)
{
    if(m<0) return 0;
    if(n<p && m<p) return f[n][m];
    return (F(n/p,m/p-1)*f[n%p][p-1]%p+Lucas(n/p,m/p)*f[n%p][m%p]%p)%p;
}
inline void init()
{
    c[0][0]=1;
    for(int i=1;i<p;++i)
    {
        c[i][i]=1,c[i][0]=1;
        for(int j=1;j<i;++j)
            {
                c[i][j]=c[i-1][j-1]+c[i-1][j];
                inv(c[i][j]);
            }
    }
    for(int i=0;i<p;++i)
    {
        f[i][0]=c[i][0];
        for(int j=1;j<p;++j)
            {
                f[i][j]=f[i][j-1]+c[i][j];
                inv(f[i][j]);
            }
    }
}
signed main()
{
    int t=read();
    init();
    while(t--)
    {
        n=read(),m=read();
        cout<<F(n,m)<<endl;
    }
}

前几天数学老师讲了讲多项式除法

一个典型的例子

image

大概就是像整数除法一样长除法求解即可,消去被除数大于除数的最高次数,剩下的就是结果及余数

根本表述不清啊,还是太菜了吧

然后这个好像可以解决三次一元方程的求解(?)

如有错误请指出(肯定有错误啊


其实今天本来是没有闲话的,因为英语老师兼班主任让我写英语的小题,本来打算用晚自习写写,但是我凭借强大的贺答案能力,然后 30 分钟完事了,所以就有了这篇闲话

明天好像有模拟赛,而且是选拔性质的,肯来要好好备考了啊

对了,我连快读都还没背过,输了!

\(\ \ \ \ \ \ \ \ \ \color{white}我果然是失败者!\)