全错位排序

告别CPU空转!用STC8的SPI+DMA高效驱动上百颗WS2812B灯珠 本文详细解析了如何利用STC8单片机的SPI+DMA外设高效驱动WS2812B全彩灯珠,解决传统软件延时驱动方式在长灯带应用中的性能瓶颈。通过硬件方案设计、数据格式转换和DMA传输配置,实现高达400Hz的刷新率和低于5%的CPU占用率,适用于大规模灯光项目。 阅读详情

简介

全错位排列被著名数学家欧拉(Leonhard Euler,1707-1783)称为“组合数论的一个妙题”的“装错信封问题”的两个特例。

“装错信封问题”是由当时最有名的数学家约翰·伯努利(Johann Bernoulli,1667-1748)的儿子丹尼尔·伯努利(DanidBernoulli,1700-1782)提出来的,大意如下:
一个人写了n封不同的信及相应的n个不同的信封,他把这n封信都装错了信封,问都装错信封的装法有多少种?

公式证明
n个相异的元素排成一排 a1,a2,…,an a 1 , a 2 , … , a n ,则 ai a i 不在第i位的排列数为:
证明:
设1,2,…,n的全排列 t1,t2,…,tn t 1 , t 2 , … , t n 的集合为I,而使 ti=i t i = i 的全排列的集合记为Ai(1<=i<=n),
则 Dn=|I|−|A1∪A2∪…∪An| D n = | I | − | A 1 ∪ A 2 ∪ … ∪ A n |
所以 Dn=n!−|A1∪A2∪…∪An| D n = n ! − | A 1 ∪ A 2 ∪ … ∪ A n |
注意到 |Ai|=(n−1)! | A i | = ( n − 1 ) ! ,
|Ai∩Aj|=(n−2)! | A i ∩ A j | = ( n − 2 ) ! ,…, |A1∩A2∩…∩An|=0!=1 | A 1 ∩ A 2 ∩ … ∩ A n | = 0 ! = 1
由容斥原理:
Dn=n!−|A1∪A2∪…∪An|=n!−C1n(n−1)!+C2n(n−2)!−C3n(n−3)!!+…+(−1)nCnn∗0!=n!(1−1/1!+1/2!−…+(−1)n/n!) D n = n ! − | A 1 ∪ A 2 ∪ … ∪ A n | = n ! − C n 1 ( n − 1 ) ! + C n 2 ( n − 2 ) ! − C n 3 ( n − 3 ) ! ! + … + ( − 1 ) n C n n ∗ 0 ! = n ! ( 1 − 1 / 1 ! + 1 / 2 ! − … + ( − 1 ) n / n ! )

应用

1、简单排列

1个元素没有全错位排列,2个元素的全错位排列有1种,3个元素的全错位排列有2种,4个元素的全错位排列有9种,5个元素的全错位排列有44种。
即上述公式,表示全部都错有多少种错法。

2、递推公式

2.1递推公式
用A、B、C……表示写着n位友人名字的信封,a、b、c……表示n份相应的写好的信纸。把错装的总数为记作f(n)。假设把a错装进B里了,包含着这个错误的一切错装法分两类:
(1)b装入A里,这时每种错装的其余部分都与A、B、a、b无关,应有f(n-2)种错装法。
(2)b装入A、B之外的一个信封,这时的装信工作实际是把(除a之外的)(n-1 )份信纸b、c……装入(除B以外的)n-1个信封A、C……,显然这时装错的方法有f(n-1)种。

总之在a装入B的错误之下,共有错装法f(n-2)+f(n-1)种。a装入C,装入D……的n-2种错误之下,同样都有f(n-2)+f(n-1)种错装法,因此:

f(n)=(n-1) {f(n-1)+f(n-2)}(代码实现的时候这个递推公式很重要)
公式可重新写成 f(n)-nf(n-1)=-[f(n-1)-(n-1)f(n-2)] (n>2)
于是可以得到
f(n)-nf(n-1)=-[f(n-1)-(n-1)f(n-2)]
=((-1)^2)[f(n-2)-(n-2)f(n-3)]
=((-1)^3)[f(n-3)-(n-3)f(n-4)]
=……
=[(-1)^(n-2)][f(2)-2f(1)]
最终得到一个更简单的递推式 f(n)=nf(n-1)+(-1)^(n-2)
或者等价式 f(n)=nf(n-1)+(-1)^(n) n=2,3,4……

2.2概率和极限
有n封不同的信,和n个信封印上了相应的地址。将这n封信放入n个信封中。
A)求至少有一封信刚好放进正确信封中的概率pn

B)当n趋向于无穷大时 ,pn的极限是多少?

都装错信封的装法:n!(1-1/1!+1/2!-1/3!+…+(-1)^n*1/n!)所以原题解答过程为:
这里写图片描述

3、神、上帝以及老天爷
Problem Description
HDU 2006’10 ACM contest的颁奖晚会隆重开始了!
为了活跃气氛,组织者举行了一个别开生面、奖品丰厚的抽奖活动,这个活动的具体要求是这样的:

首先,所有参加晚会的人员都将一张写有自己名字的字条放入抽奖箱中;
然后,待所有字条加入完毕,每人从箱中取一个字条;
最后,如果取得的字条上写的就是自己的名字,那么“恭喜你,中奖了!”

大家可以想象一下当时的气氛之热烈,毕竟中奖者的奖品是大家梦寐以求的Twins签名照呀!不过,正如所有试图设计的喜剧往往以悲剧结尾,这次抽奖活动最后竟然没有一个人中奖!——即上述信封全都装错

我的神、上帝以及老天爷呀,怎么会这样呢?

不过,先不要激动,现在问题来了,你能计算一下发生这种情况的概率吗?

不会算?难道你也想以悲剧结尾?

Input
输入数据的第一行是一个整数C,表示测试实例的个数,然后是C 行数据,每行包含一个整数n(1 < < n <= <= 20),表示参加抽奖的人数。
Output
对于每个测试实例,请输出发生这种情况的百分比,每个实例的输出占一行, 结果保留两位小数(四舍五入),具体格式请参照sample output。
Sample Input
1 2
Sample Output
50%

#include<iostream>
using namespace std;

int main()
{
    int c,n,i;
    //定义为double型就不需要使用long long,同时输出不需要转换类型
    double b[21]={0,1,2,6,24,120,720},a[21]={0,0,1,2};
    //计算全错位排列数
    for(i=4;i<21;i++)
    {
        //递推公式f(0)=0;f(1)=0;f(2)=1;f(3)=2;
        a[i]=(i-1)*(a[i-1]+a[i-2]);
    }
    //计算阶乘
    for(i=7;i<21;i++)
    {
        b[i]=i*b[i-1];
    }
     cin>>c;  

    while(c--)  
    {  
        cin>>n;  
        //因为要输出的是百分比
        printf("%.2lf%%\n",100*a[n]/b[n]);
        //输出用printf比cout方便得多    
    }  

    return 0;  
}

4、
Problem Description
今年暑假杭电ACM集训队第一次组成女生队,其中有一队叫RPG,但做为集训队成员之一的野骆驼竟然不知道RPG三个人具体是谁谁。RPG给他机会让他猜猜,第一次猜:R是公主,P是草儿,G是月野兔;第二次猜:R是草儿,P是月野兔,G是公主;第三次猜:R是草儿,P是公主,G是月野兔;……可怜的野骆驼第六次终于把RPG分清楚了。由于RPG的带动,做ACM的女生越来越多,我们的野骆驼想都知道她们,可现在有N多人,他要猜的次数可就多了,为了不为难野骆驼,女生们只要求他答对一半或以上就算过关,请问有多少组答案能使他顺利过关。
Input
输入的数据里有多个case,每个case包括一个n,代表有几个女生,(n<=25), n = 0输入结束。
Sample Input
1
2
0
Sample Output
1
1
思路
从全部中选出一半以上的数目遍历,与选出来的全部正确剩下的全部排错,也就是剩下的对应错排。

#include <iostream>  
#include <cstdio>  
#include <cstring>  
#include <string>  
#include <algorithm>  
#include <cstdlib>  
using namespace std;  
int main (){  
   int m;  
   __int64 C[30][30],wrongqueue[15]={0,0,1,2};//C[][]为组合,wrongqueue为全错位排列  [0]用不到 

   for(int i=1;i<=25;i++)
   {  
       C[i][1]=i;  
       C[i][0]=1;  
       for(int j=2;j<=i;j++)
       {  
            C[i][j]=C[i][j-1]*(i-j+1)/j;  
       }   
    }

    //全错位排列  
   for(int i=3;i<=12;i++)  
      wrongqueue[i]=(i-1)*(wrongqueue[i-1]+wrongqueue[i-2]);   
   scanf("%d",&m); 

   while(m!=0)
   {  
    __int64 sum=0;  
    if(m%2==0)  
        for(int i=m/2;i<m;i++)  
            sum=sum+C[m][i]*wrongqueue[m-i];  
    else  
        for(int i=m/2+1;i<m;i++)  
            sum=sum+C[m][i]*wrongqueue[m-i];

    printf("%I64d\n",sum+1);  

    scanf("%d",&m);  
    }     
    return 0;  
}
#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <iostream>  
#include <math.h>  
using namespace std;  
int a[21];  
double PaC(int n, int m)                   //Permutation and combination.  
{  
    double s=1,i;   //小技巧,doulbe型的定义   
    for(i=0;i<m;i++)  
        s*=(n-i)/(i+1);  
    return s;  
}  


void init()                           //错排的序列   
{  
    int i;  
    a[0]=0;a[1]=0;a[2]=1;  
    for(int i=3;i<=21;i++)  
      a[i]=(a[i-1]+a[i-2])*(i-1);  
    return ;  
}  

int main()  
{  
    int N,i;  
    double sum;  
    init();  
    while(~scanf("%d",&N),N)  
    {  
        int m;  
        sum=0;  
        if(N%2==0)  
            m=N/2;  
        else  
            m=N/2+1;  
        for(i=m;i<N;i++)  
            sum+=PaC(N, i)*a[N-i];            //Cnm*a[N-m];即从中选出m个正确的,则有n-m个错排的。根据分步计数原理可知。   
        printf("%lld\n",(long long int)(sum+1));//  
    }  
    return 0;  
}  
基于Python的彭博社新闻高效爬取实战:最新技术与完整代码解析 本文将详细介绍如何使用Python最新技术构建一个高效的彭博社(Bloomberg)新闻爬虫系统。我们将从爬虫基础概念讲起,逐步深入到高级反反爬技术、异步抓取、数据解析与存储等核心环节。文章包含完整的代码实现,采用最新的aiohttp、Playwright等技术栈,并特别关注法律合规性和数据质量保障。通过本文,读者将掌握一个完整的商业新闻爬虫开发流程,并能够根据实际需求进行定制化开发。关键词:Python爬虫、彭博社、Bloomberg、新闻采集、aiohttp、Playwright、反反爬技术。 阅读详情

相关推荐

储能BMS三级架构解析:从模组到堆的管理与控制

本文深入解析了储能电池管理系统(BMS)的核心三级架构,即电池模组管理层(BMU)、电池簇管理层(BCMU)和电池堆管理层(BAMS)。文章详细阐述了各级的职能分工与协同机制,从底层数据采集、均衡管理,到中层信息汇总与安全控制,再到顶层的系统总控与对外通信,揭示了该架构如何实现大规模储能电池的精细化、安全与高效管理。

ik678901234的博客 472

全错位排列

以前接触过这样的题目,但是现在稍微系统点 首先看一下百度百科对全错位排列的解释: 基本简介 全错位排列:即被著名数学家欧拉(Leonhard Euler,1707-1783)称为组合数论的一个妙题的“装错信封问题”。 “装错信封问题”是由当时最有名的数学家约翰·伯努利(Johann Bernoulli,1667-1748)的儿子丹尼尔·伯努利(DanidBernoulli,1700-178

AI蜗牛之家 1万+

Seedance 2.5、HappyHorse 1.1与豆包Seed 2.1:一周内三大模型技术参数分析

音频生成延续原生音画同步架构,将文本、画面、音频统一序列建模,生成过程同步产出匹配口型的原声音频,支持中、英、日、韩、德、法、阿拉伯7种语言唇形对齐,无需二次调音。从行业趋势看,30秒直出、4K分辨率、7语种唇形同步正在成为视频生成的标配,编程Agent化和多模态理解正在成为语言模型的标配。技术狂奔的同时,监管在同步收紧。我理解这里的关键在于,视频生成模型的商业化落地不仅取决于生成质量,更取决于推理效率——生成一段15秒1080P视频需要多少秒、消耗多少算力,直接决定了模型的商用可行性。

lichunchuan1的博客 325

全错位排列问题

问题描述这是一个很经典的数学问题:有一个人写了n封信件,对应n个信封,然而粗心的秘书却把所有信件都装错了信封,那么一共有多少种装错的装法?数学抽象这个问题可抽象为以下一个数学问题:已知一个长度为n的有序序列{a1,a2,a3,…,an},打乱其顺序,使得每一个元素都不在原位置上,则一共可以产生多少种新的排列? 例如:原序列为{a,b,c,d,e},则新序列{b,c,d,e,a}为其一个全错位排列,

u013051851的博客 1万+

运放+三极管恒流源电路设计实战:从原理到仿真一步到位(附Multisim文件)

本文详细解析了运放与三极管构建恒流源电路的核心原理,重点阐述了负反馈机制如何实现精准的电流控制。通过Multisim仿真实战,从电路搭建、参数计算到负载调整率与动态响应分析,一步步指导设计过程,并提供常见故障的调试技巧与PCB设计要点,帮助工程师从理论平稳过渡到可靠实践。

7z8x2c4v6b9的博客 711

计算机组成原理课程设计_微程序控制的简单模型机设计

微程序控制的简单模型机设计 要求 基本要求 完成一个简单主机的设计,模型机应具备如下能力:在自行设计的指令集基础上,运行自行编写的简单用户程序,实现特定运算功能。 弹性要求 在此基础上,完成必要的扩展,实现模型机的功能扩展设计,包括:实现多种运算功能(指令集的扩充)、支持更为丰富的寻址方式、有更为完善的微程序设计等。 实验软件和硬件环境 QuartusII, FPGA计算机组...

sailist的记录站 3万+

【组合数学】全错位排列的递推公式推导

绝对不是一句话!和“易得”!全错位排列的递推公式推导!

这里是大千小熊的博客,一个温暖故事的开篇 4120

创客学院嵌入式驱动开发——学习资料汇总

1.创客学院知识巩固-01C语言回顾_C/C++_Set_Mode的博客-优快云博客https://blog.youkuaiyun.com/Set_Mode/article/details/94431050 2.创客学院知识巩固-02数据结构_Set_Mode的博客-优快云博客https://blog.youkuaiyun.com/Set_Mode/article/details/94431087 3.创客学院知...

snaking616 5116

全错位排序公式推导

全错位排序 全错位排列被著名数学家欧拉(Leonhard Euler,1707-1783)称为“组合数论的一个妙题”的“装错信封问题”的两个特例。 “装错信封问题”是由当时最有名的数学家约翰·伯努利(Johann Bernoulli,1667-1748)的儿子丹尼尔·伯努利(DanidBernoulli,1700-1782)提出来的,大意如下: 一个人写了n封不同的信及相应的n个不同的信封,他把这n封信都装错了信封,问都装错信封的装法有多少种? f[n]表示有n个信封全错位情况数 可以把问题分成两种情况:①

Leida_wanglin的博客 7631

Python 爬虫实战:淘宝直播间实时数据抓取(弹幕分析 + 流量监控)

随着电商直播的迅猛发展,淘宝直播已成为品牌推广和商品销售的重要阵地。通过爬取淘宝直播间的实时数据,包括弹幕互动和流量信息,可以帮助商家深入了解用户行为、优化直播策略,同时为市场分析和商业决策提供数据支持。本文将深入探讨如何利用 Python 爬虫技术实现对淘宝直播间实时数据的抓取,并进行弹幕分析和流量监控。

u014481728的博客 730

【一看就会】autoware universe项目结构解析——从一层一层直到control源码

下载安装autoware universe花了一天。下载好之后,按照网上说的跑了一下仿真是能跑的,证明下的代码没问题。然后就得看一下各模块实现的源码了。但是当我打开这些文件的时候。我勒个豆。这么多是个玩意儿。我连该启动哪个launch文件,哪个文件夹是干啥的都不知道。在我慢慢弄懂之后,我也记录这个庞大的项目的各个文件夹和里面的文件以及项目,以及自己使用时应该启动哪些launch文件。这篇文章目的就是通过找到control部分的源码,来帮助我们梳理这个庞大项目的各个文件的功能。

weixin_48386130的博客 2037

One Day One Step 之全错位排序

 One Day One Step 之全错位排序 今天做了一道题,是关于全错位排序的。在高中的时候,对排列组合一直很头痛,所以今天趁这个机会,好好学习学习! 先来看一下题目吧! 神、上帝以及老天爷 Crawling inprocess... Crawling failed Time Limit:1000MS     Memory Limit:32768KB 

Stay Hungry,Stay Foolish 1226

SAP 批次管理(分割评估)

批次分割评估: 业务场景:企业要求各批次物料成本价格不一样。此时可以采用分割批次来实现不同成本 后台配置: (1)、激活分割评估 后台---物料管理----评估与科目设置---分割评估-----激活分割评估 (2)、配置分割评估 后台---物料管理----评估与科目设置---分割评估-----配置分割评估 进入全局性分类后,批次分割采用已有的评估类型“X自动(批)”: ...

willieyuan的博客 1万+

hdu2048 全错位排序问题

hdu2048是全错位排序的题目!欧拉给我们证明了可以直接套用公式 f(n)=  nf(n-1)+(-1)^(n-2)  或  nf(n-1)+(-1)^(n)                   n=2,3,4…… 两个其实等价的 我个人是用后面那个的 本文最后面是欧拉关于装错信封问题的求解思路。如果有兴趣的可以看看。 附上代码: #include #include int m

calu的专栏 2059

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

组合数学 - 全错位排序公式

不容易系列之一 Problem Description 大家常常感慨,要做好一件事情真的不容易,确实,失败比成功容易多了!做好“一件”事情尚且不易,若想永远成功而总从不失败,那更是难上加难了,就像花钱总是比挣钱容易的道理一样。话虽这样说,我还是要告诉大家,要想失败到一定程度也是不容易的。比如,我高中的时候,就有一个神奇的女生,在英语考试的时候,竟然把40个单项选择题全部做错了!大家都学过概率论

北岛知寒 7135

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

HDU-1465-不容易系列之一(简单全错位排序)

不容易系列之一 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 14468    Accepted Submission(s): 6026 Problem Description 大家常常感慨,要做好一件事情真的不容易,确

qq_18062811的专栏 525

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

P1595 信封问题(递推AC)

P1595 信封问题 题目描述 某人写了n封信和n个信封,如果所有的信都装错了信封。求所有信都装错信封共有多少种不同情况。 输入格式 一个信封数n(n<=20) 输出格式 一个整数,代表有多少种情况。 输入输出样例 输入 #1 2 输出 #1 1 输入 #2 3 输出 #2 2 我的思路 这题是一个数论问题,运用数学知识很容易解出。 全错位排序递推公式:f[n] = (n - 1)*(f[n-1] + f[n-2]) 全错位排序公式推导 此题需要注意的是数据范围是long long, 而不是i

Leida_wanglin的博客 1029

NYOJ-451-光棍节的快乐

光棍节的快乐 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 光棍们,今天是光棍节。聪明的NS想到了一个活动来丰富这个光棍节。 规则如下: 每个光棍在一个纸条上写一个自己心仪女生的名字,然后把这些纸条装进一个盒子里,这些光 棍依次抽取一张纸条,如果上面的名字就是自己心仪的女生,那么主持人就在现场给该女生打电话,告诉这个光棍对她的爱慕之情,并让光棍当场表

qq_18062811的专栏 672

错位排序。

糊涂人寄信。

2503_91355158的博客 61

数论基础模板

中国剩余定理//模板 int exgcd(int a,int b,int &x,int &y) //扩展欧几里得算法 c = ax + by gcd(a,b)|c { if(b==0) { x=1; y=0; return a; } int d = exgcd(b,a%b,y,x); y -= a/b*

ZHangFFYY的博客 540

java错位_【LeetCode(Java) - 634】寻找数组的错位排列

【LeetCode(Java) - 634】寻找数组的错位排列【LeetCode(Java) - 634】寻找数组的错位排列文章目录1、题目描述2、解题思路3、解题代码1、题目描述2、解题思路??把题目转换为:对一个完美排序的序列,转换成错位排列,共有多少种排法。??先拿数字 n 开刀,有 n-1 个位置可以选,假设选择位置 k 来放数字 n:??现在数字 k 的位置被数字 n 给占领了,就得给数...

weixin_30629043的博客 291

二进制书籍分类的交换最少次数问题:C++保姆级解法(含时间复杂度优化技巧)

本文深入剖析了二进制序列重排问题,旨在通过最少交换次数将所有0移至1之前。文章从暴力解法陷阱入手,揭示了将问题转化为“错位计数”的核心洞察,并提供了时间复杂度为O(n)、空间复杂度为O(1)的C++最优解法,包含详细的代码实现、正确性证明及边界处理。

gin88的博客 378

经典算法题:全错位排列问题

问题描述 这是一个很经典的数学问题:有一个人写了n封信件,对应n个信封,然而粗心的秘书却把所有信件都装错了信封,那么一共有多少种装错的装法? 数学抽象 这个问题可抽象为以下一个数学问题:已知一个长度为n的有序序列{a1,a2,a3,…,an},打乱其顺序,使得每一个元素都不在原位置上,则一共可以产生多少种新的排列? 例如:原序列为{a,b,c,d,e},则新序列{b,c,d,e,a}为其一个全错位排列,新序列中每一个元素都不在原来的位置上。 问题解决 首先考虑几种简单的情况: 原序列长度为1 序列中只

li4692625的博客 3081
上一篇: C++之STL容器
下一篇: C++之STL算法
_VioletHan_
博客等级 码龄10年 131粉丝 70原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值