[ZJOI2011]看电影(组合数学/打表+高精)

本文解析了一个数学概率问题,涉及电影院座位分配的特殊规则,通过转换思维将问题转化为环状结构,利用组合数学的方法求解全班同学都有座位的概率,给出了详细的算法实现。

Description

到了难得的假期,小白班上组织大家去看电影。但由于假期里看电影的人太多,很难做到让全班看上同一场电影,最后大家在一个偏僻的小胡同里找到了一家电影院。但这家电影院分配座位的方式很特殊,具体方式如下: 1. 电影院的座位共有K个,并被标号为1…K,每个人买完票后会被随机指定一个座位,具体来说是从1…K中等可能的随机选取一个正整数,设其为L。 2. 如果编号L的座位是空位,则这个座位就分配给此人,否则将L加一,继续前面的步骤。 3. 如果在第二步中不存在编号L的座位,则该人只能站着看电影,即所谓的站票。小白班上共有N人(包括小白自己),作为数学爱好者,小白想知道全班都能够有座位的概率是多少。

Input

输入文件第一行有且只有一个正整数T,表示测试数据的组数。 第2~T+1行,每行两个正整数N,K,用单个空格隔开,其含义同题目描述。

Output

输出文件共包含T行。第i行应包含两个用空格隔开的整数A,B,表示输入文件中的第i组数据的答案为A/B。(注意,这里要求将答案化为既约分数)

Sample Input

3
1 1
2 1
2 2

Sample Output

1 1
0 1
3 4

【数据范围】
对于100%的数据 T<=50,N,K<=200

 

其实这题正解是打表找规律

首先我们一定是把所有方案数作为分母,

显然是$k^n$

另外当$n>k$时输出0 1即可

之后的思路就比较神仙

我们把链转成环,并在最后加一个座位

这样根据题目给定的规则,由于$n<k$,每个人最后一定可以坐下

如果有人走到座位$k$都不能坐下,他就会在加的那个座位坐下

那么一个合法方案 即加的座位没有人坐的情况

这时候就可以开始列柿子了

$n$个人,每次选$k+1$中的一个坐下(反正最终一定能坐下,不用想的太复杂),$(k+1)^n$

且因为环的性质(哪都能断,可能重复),每种排列算了k+1次

所以这部分是$\frac{(k+1)^n}{k+1}=(k+1)^{n-1}$

且有$k-n+1$个空着的

我们可以选择从这些位置断开重新伸展成链,使第$k+1$个座无意义化

$ANS=\frac{(k+1)^{n-1}(k-n+1)}{k^n}$

没模法显然要高精对吧

(高精乘低精就搞定了)

这道题还要求输出约分后的结果别告诉我你要高精除

分母累乘的时候一直求gcd一直约就行了

(快速幂什么的都去死吧)

 

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int T,n,k,num1[10005],num2[10005],n1;
void mult(int x,int a[])
{
    int k=0;
    for(int i=1;i<=a[0];i++)
    {
        int tmp=a[i]*x+k;
        a[i]=tmp%10;
        k=tmp/10;
    }
    while(k)a[++a[0]]=k%10,k/=10;
}
int gcd(int x,int y)
{
    if(!y)return x;
    return gcd(y,x%y);
}
void work()
{
    scanf("%d%d",&n,&k);
    memset(num1,0,sizeof(num1));
    memset(num2,0,sizeof(num2));
    num1[0]=num1[1]=num2[0]=num2[1]=1;
    if(n>k)
    {
        puts("0 1");
        return ;
    }
    n1=k-n+1;
    for(int i=1;i<=n-1;i++)
        mult(k+1,num1);
    for(int i=1;i<=n;i++)
    {
        int now=k,GCD=gcd(k,n1);
        if(GCD!=1)
        {
            now/=GCD;
            n1/=GCD;
        }
        mult(now,num2);
    }
    mult(n1,num1);
    for(int i=num1[0];i;i--)
        printf("%d",num1[i]);
    printf(" ");
    for(int i=num2[0];i;i--)
        printf("%d",num2[i]);
    puts(" ");
}
int main()
{
    scanf("%d",&T);
    while(T--)work();
    return 0;
}

 

转载于:https://www.cnblogs.com/Rorschach-XR/p/11140888.html

一、数据采集层:多源人脸数据获取 该层负责从不同设备 / 渠道采集人脸原始数据,为后续模型训练与识别提供基础样本,核心功能包括: 1. 多设备适配采集 实时摄像头采集: 调用计算机内置摄像头(或外接 USB 摄像头),通过OpenCV的VideoCapture接口实时捕获视频流,支持手动触发 “拍照”(按指定快捷键如Space)或自动定时采集(如每 2 秒采集 1 张),采集时自动框选人脸区域(通过Haar级联分类器初步定位),确保样本聚焦人脸。 支持采集参数配置:可设置采集分辨率(如 640×480、1280×720)、图像格式(JPG/PNG)、单用户采集数量(如默认采集 20 张,确保样本多样性),采集过程中实时显示 “已采集数量 / 目标数量”,避免样本不足。 本地图像 / 视频导入: 支持批量导入本地人脸图像文件(支持 JPG、PNG、BMP 格式),自动过滤非图像文件;导入视频文件(MP4、AVI 格式)时,可按 “固定帧间隔”(如每 10 帧提取 1 张图像)或 “手动选择帧” 提取人脸样本,适用于无实时摄像头场景。 数据集对接: 支持接入公开人脸数据集(如 LFW、ORL),通过预设脚本自动读取数据集目录结构(按 “用户 ID - 样本图像” 分类),快速构建训练样本库,无需手动采集,降低系统开发与测试成本。 2. 采集过程辅助功能 人脸有效性校验:采集时通过OpenCV的Haar级联分类器(或MTCNN轻量级模型)实时检测图像中是否包含人脸,若未检测到人脸(如遮挡、侧脸角度过大),则弹窗提示 “未识别到人脸,请调整姿态”,避免无效样本存入。 样本标签管理:采集时需为每个样本绑定 “用户标签”(如姓名、ID 号),支持手动输入标签或从 Excel 名单批量导入标签(按 “标签 - 采集数量” 对应),采集完成后自动按 “标签 - 序号” 命名文件(如 “张三
### Python 实现等比数列求和 要计算等比数列 \(1 + \frac{1}{2} + \frac{1}{4} + ... + \frac{1}{1024}\) 的和,可以利用等比数列的性质以及循环结构来完成。以下是具体的实现方式: #### 方法一:基于公式法 已知等比数列前 \(n\) 项和的公式为: \[ S_n = a \cdot \frac{1-q^n}{1-q}, q \neq 1 \] 其中 \(a\) 是首项,\(q\) 是公比。 在这个例子中,首项 \(a=1\),公比 \(q=\frac{1}{2}\),最后一项为 \(\frac{1}{1024}\),通过解方程找到总共有多少项 \(n\) 后代入公式即可[^1]。 ```python def geometric_sum_formula(a, q, last_term): n = int(round(-np.log(last_term / a) / np.log(q))) # 计算项数 total_sum = a * (1 - q ** n) / (1 - q) return total_sum import numpy as np result = geometric_sum_formula(1, 0.5, 1/1024) print(f"The sum of the series is {result}") ``` #### 方法二:迭代累加法 如果不想直接使用公式,则可以通过逐项相加的方式得到结果。这种方法更加直观易懂。 ```python total_sum = 0 current_term = 1 while current_term >= 1/1024: total_sum += current_term current_term /= 2 print(f"The sum of the series using iteration is {total_sum}") ``` 以上两种方法均能有效解决问题,并且可以根据实际需求选择更合适的一种[^3]。 ### 注意事项 需要注意的是,在处理浮点运算时可能会遇到精度损失的问题,尤其是在涉及大量小数操作的情况下。因此建议在必要时候引入 `decimal` 或者其他高精库来进行辅助计算[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值