学习第八天(儿童编程探秘)

编程瞎扯蛋

没错,自从昨天讲了一个NOI特殊进入方法后,我就决定搞一个《编程瞎扯蛋》节目
所以,又到了瞎扯蛋环节。
今天我们要讲的是题目上的那个——儿童编程。
为什么会讲这个话题?
因为:
学习第八天(儿童编程探秘)_第1张图片

还有:
学习第八天(儿童编程探秘)_第2张图片

我就很好奇,这是个什么玩意儿呢?
于是查了一下:
学习第八天(儿童编程探秘)_第3张图片

没错,有很多广告(要不然百度天天展示干啥)
紧接着,我找到了某百科:
学习第八天(儿童编程探秘)_第4张图片

其实他们并不教授代码编写,而是什么图形化编程
于是,我到几个大网站找到了如下信息:
学习第八天(儿童编程探秘)_第5张图片

这里写图片描述

学习第八天(儿童编程探秘)_第6张图片

人家已经解释得非常清楚了,这个Scratch就是那个图形化编程工具
但是,我还是查了一下,好像是麻省理工的一个啥编出来的
那么这个所谓的“搭积木”是怎样的呢?
学习第八天(儿童编程探秘)_第7张图片

很轻松,不是么?
还有一个疑点,那就是为什么,这种儿童编程班最近忽然多了起来?
于是,我又顺藤摸瓜,找到了:
学习第八天(儿童编程探秘)_第8张图片

学习第八天(儿童编程探秘)_第9张图片

后面的这一个是在最近颁布的《促进新一代人工智能产业发展三年行动计划(2018-2020年)》这个文件中摘录的
显然了,政策支持
怎么讲呢
在如今这个互联网发达的时代,儿童是应该接触编程,而且,我认为以后编程应该被加入高中课程,最好能作为一门考试科目去考察,这是符合当前流行的STEAM教育(Science、Technology、Engineering、Art、Mathmetics)。
当然,小的时候,培养兴趣最重要,要是上来就给孩子讲一堆难懂的代码,会很枯燥。
所以,我还是比较支持这个儿童编程班的。

信息学

第一题:Perm排列计数

一开始,我很脑抽地领会错了题目的意思。
我以为那个P(i)>P(i/2)只对偶数管用,根本没想到i/2可以下去整
于是很快乐地做了一个小时
又是杨辉三角,又是log表,又是素数
搞得不亦乐乎
结果,当样例没过是,我才意识到……
What the f***?
于是,重头再来(有没有搞错,我的时间很宝贵诶)
算了,谁叫我不细心呢
于是我开始重新审视这道题
很容易联想到二叉树
因为对于一个节点i,它下面对应着两个节点i<<2和i<<2|1
所以,我们很自然地想到数位dp
所以我们设置两个数组size[]和f[]
f[i]表示以i为根节点的子树的种类数
显然最终答案是f[1]
size[i]是指以i为根节点的子树的节点数
那么转移方程就出来了:

f[i]=f[i<<1]*f[i<<1|1]*C(size[i]-1,size[i-1]);

这里的C(n,m)表示组合数
那么,接下来的重点,就是这个组合数
给的数据并不小诶
所以,我们就搬出了Lucas定理
具体知识点回头再说
代码如下:

#include
#include
#include
using namespace std;
long long n,p;
long long f[2000005],size[2000005];
long long fac[2000005],inv[2000005];
void init(){
    fac[0]=fac[1]=1;
    inv[0]=inv[1]=1;
    for(int i=2;i<=n;i++){
        fac[i]=fac[i-1]*i%p;
//      inv[i]=(-p/i)*inv[p%i]%p;  
    }
    for(int i=2;i<=n;i++){
        inv[i]=(p/i+1)*inv[i-p%i]%p;
    }
    for(int i=2;i<=n;i++){
        inv[i]=inv[i]*inv[i-1]%p;
    } 
}
long long C(long long a,long long b){
    if(areturn 0;
    }
    if(areturn fac[a]*inv[b]%p*inv[a-b]%p;
    }
    return C(a%p,b%p)*C(a/p,b/p)%p;
}
int main(){
    memset(size,0,sizeof(size));
    scanf("%lld%lld",&n,&p);
    init();
    for(int i=n;i>=1;i--){
        size[i]=size[i<<1]+size[i<<1|1]+1;
        f[i]=((i<<1)>n?1:f[i<<1])*((i<<1|1)>n?1:f[i<<1|1])%p*C(size[i]-1,size[i<<1])%p;
    }
    printf("%lld",f[1]);
    return 0;
}

第三题:生命数组

这里供大家思考,明天我会发题解!

数学

刷题

物理

刷题

总结

没错,我又忘了面试
明日何其多
加油!

你可能感兴趣的:(北京大学暑期课堂信息科学)