数论(二)——博弈论与组合计数

news2024/11/24 20:40:13

文章目录

    • 4+题单
        • A - [有趣的数](https://www.acwing.com/problem/content/description/3198/)
        • B - [取数游戏 II](https://www.luogu.com.cn/problem/P1288)
        • C - [acwing-nim](https://www.acwing.com/problem/content/submission/code_detail/29453954/)
        • D - [排列计数](https://www.acwing.com/problem/content/description/232/)

4+题单

A - 有趣的数

动态规划的时候出过一次,在n-1位中先选j个2,剩下的n-j个数的位子全部放剩下的两个数,其中j个数中的第一位一定是2,剩下的j-1位就有j-1种选择也就是,反正最后有个3兜底,剩下的你n-j个数也一样,留一位兜底,那么0就有n-j-1种位置可以选

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
const int mod=1000000007,N=1e3+10;
ll c[N][N];

signed main()
{
  int n;
  cin>>n;
  
  //预处理出组合数
  for(int i=0;i<=n;i++)
  {
    for(int j=0;j<=i;j++)
    {
      if(!j) c[i][j]=1;
      else 
      	c[i][j]=(c[i-1][j]%mod+c[i-1][j-1]%mod);
    }
  }
  
  //在n-1个位置种选
  ll res=0;
  for(int i=2;i<=n-2;i++)
  {
    res=(res+c[n-1][i]*(i-1)*(n-i-1))%mod;
  }
  cout<<res<<endl;
  
  
  return 0;
}
B - 取数游戏 II

博弈论了.

初步想法是能够同时在左右两条边都为0的起点就都不能赢。否则先出发的在选择起点的时候一定是0边的左右任意一条边都能赢

两个人是同一个起点

#include<bits/stdc++.h>

using namespace std;
const int N=22;
int a[N];

signed main()
{
  int n;
  cin>>n;
  for(int i=1;i<=n;i++)
  {
    cin>>a[i];
  }
  for(int i=1;i+1<=n;i++)
  {
    if(a[i]==a[i+1]&&!a[i])
    {
      puts("NO");
      return 0;
    }
  }
  puts("YES");
  return 0;
}

洛谷题解后

#include<bits/stdc++.h>

using namespace std;
const int N=25;
int a[N];

signed main()
{
  int n;
  cin>>n;
  //为什么一定要先读入,不先读入,测试点8过不了
  for(int i=1;i<=n;i++) cin>>a[i];
  for(int i=1;i<=n;i++)
  {
    if(a[i]==0)
    {
      if(i%2==0)
      {
          puts("YES");
          return 0;
      }
      break;
    }
  }
  
  for(int i=n;i>=1;i--)
  {
    if(a[i]==0)
    {
      if((n-i+1)%2==0)
      {
          puts("YES");
          return 0;
      }
      break;
    }
  }
  puts("NO");
  return 0;
}
C - acwing-nim

如果所有数异或之后是不为0的数x,那么一定存在一个数 a i a_i ai能满足使x的最高位为1,那么让 a i a_i ai与x异或,再用 a i a_i ai减,就可以会等于,一定会有剩下 a i − ( a i − ( a i ∣ x ) ) a_i-(a_i-(a_i|x)) ai(ai(aix))和原来所有数异或之后的值相等,那么原本先手拿走的 a i ∣ x a_i|x aix这么多的石头,会让剩下的所有数异或起来是0,这样就能够达到先手先出手就赢的状态

#include<iostream>
#include<cstring>

using namespace std;

int main() {
	int t;
	cin>>t;
	while(t--)
	{
	    int n;
    	cin >> n;
    	int res = 0;
    	while (n--) {
    		int x;
    		cin >> x;
    		res ^= x;
    	}
    	if (res) puts("YES");
    	else puts("NO");
	}

	return 0;
}
D - 排列计数

感觉还是要用到组合数,在n个里面固定m个,剩下(n-m)个排列组合减去他们也等于i的可能性

#include<bits/stc++.h>

using namespace std;
const int mod=1e9+7,N=1e6+5;
int c[N][N];
int fact[N],infact[N];

signed main()
{
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int t;
  scanf("%d",&t);
  for(int i=0;i<=N;i++)
  {
    for(int j=0;j<=i;j++)
    {
      if(!j) c[i][j]=1;
      else c[i][j]=c[i-1][j]%mod+c[i-1][j-1]%mod;
    }
  }
  while(t--)
  {
    int n,m;
    cin>>n>>m;
    for(int i=1;)
  }
  return 0;
}

优质题解

正解,是组合数乘上错排,

image-20240821123204344

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;
typedef long long ll;
const ll mod=1e9+7,N=1e6+10;
ll f[N];
ll fact[N],infact[N];

ll qui(ll a,ll b)
{
  ll res=1;
  while(b)
  {
    if(b&1) res=res*a%mod;
    a=a*a%mod;
    b>>=1;
  }
  return res;
}

signed main()
{
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int t;
  scanf("%d",&t);
  fact[0]=fact[1]=infact[0]=infact[1]=1;
  f[0]=1;
  f[1]=0;
  f[2]=1;
  fact[2]=2;
  infact[2]=qui(fact[2],mod-2)%mod;
  for(int i=3;i<=N;i++)
  {
    f[i]=(f[i-1]+f[i-2])%mod*(i-1)%mod;
    fact[i]=fact[i-1]*i%mod;
    infact[i]=qui(fact[i],mod-2);
  }
  while(t--)
  {
    int n,m;
    scanf("%d%d",&n,&m);
    printf("%lld\n",(fact[n]*infact[n-m]%mod*infact[m]%mod*f[n-m]%mod));
  }
  return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2058868.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言小tip之整型提升

今天让我们来学习一下C语言中的一个小知识点-----整型提升 什么叫整型提升呢&#xff1f; C语言中整型算术运算总是至少以缺省&#xff08;默认&#xff09;整型类型的精度来进行的。​为了获得这个精度&#xff0c;表达式中的字符和短整型操作数在使用之前被转换为普通整型&a…

从大模型到通用AI《智能计算系统》带你揭秘大模型背后的智能计算革命

“只要你想把大模型做得更好、做得更大、做得更快、做得更省电&#xff0c;你就必须要有系统的人才跟思维。 . 我们这个领域变化得特别快,教的内容,教的方式,都要不断地变化。如果我们中国的研究者和教育者做得更好一点如果我们在具身智能的大模型上,或者是说在未来终极的通用人…

AI预测福彩3D采取888=3策略+和值012路或胆码测试8月21日新模型预测第63弹

经过62多期的测试&#xff0c;当然有很多彩友也一直在观察我每天发的预测结果&#xff0c;得到了一个非常有价值的信息&#xff0c;那就是9码定位的命中率非常高&#xff0c;62多期一共只错了6次&#xff0c;这给喜欢打私房菜的朋友提供了极高价值的预测结果~当然了&#xff0c…

【JVM】JVM解析字节码文件过程(二)

JVM解析字节码文件过程 字节码中的数据结构 field_info 在Java字节码中&#xff0c;field_info结构是用来描述类或接口中的字段(成员变量的)。每个field_info结构对应类文件中的一个字段。其中它的组成部分包括如下&#xff1a; 1.access_flags:访问标志,表示字段的访问级别(如…

哪款骨传导耳机好?2024不同价位骨传导耳机推荐!

对于我个人而言&#xff0c;蓝牙耳机早已成为了我形影不离的“私人音乐盒”&#xff0c;满足了我日常各式各样的需求&#xff0c;仿佛是身体的一部分&#xff0c;不可或缺。然而&#xff0c;我也曾面临一个不小的挑战——由于耳孔小巧且敏感&#xff0c;长时间佩戴传统的入耳式…

使用钉群发送告警通知

创建钉群&#xff0c;添加机器人 创建群 添加机器人并设置信息 需要注意的是设置“安全设置”时如果使用自定义关键词方式&#xff0c;那设置的内容必须要包含告警消息的内容 代码 模拟http请求发送通知 /*** param content 消息内容* param webhook 设置告警通知的群中机器…

基于vue框架的搬家网平台iz216(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,服务项目,订单信息,工人,商家,项目类型,指派信息,进度情况,服务评价 开题报告内容 基于Vue框架的搬家网平台开题报告 一、引言 随着城市化进程的加快和人们生活水平的提高&#xff0c;搬家服务需求日益增长。传统的搬家服务往往…

pygame开发课程系列(8):进阶开发

第八章 进阶学习 在本章中&#xff0c;我们将深入探讨一些高级的游戏开发技巧。这些技术可以使你的游戏更具吸引力和互动性&#xff0c;从动画效果到复杂的碰撞检测&#xff0c;再到多人网络功能。掌握这些技巧将帮助你提升游戏的质量&#xff0c;并为玩家带来更丰富的体验。 …

QWidget加border-color,一定要使用确定的名字。要不然整个qwidget内部的子控件都会添加边框

QWidget加border-color&#xff0c;一定要使用确定的名字。要不然整个qwidget内部的子控件都会添加边框

【学术会议征稿】第二届物联网与云计算技术国际学术会议 (IoTCCT 2024)

第二届物联网与云计算技术国际学术会议 (IoTCCT 2024) 2024 2nd International Conference on Internet of Things and Cloud Computing Technology (IoTCCT 2024) 第二届物联网与云计算技术国际学术会议(IoTCCT 2024)将于2024年9月27日至29日于广西桂林召开。本次会议将围绕…

zabbix常见架构及组件

Zabbix作为一个开源的、功能全面的监控解决方案&#xff0c;广泛应用于各类组织中&#xff0c;以实现对网络、服务器、云服务及应用程序性能的全方位监控。部署架构灵活性高&#xff0c;可支持从小型单一服务器环境到大型分布式系统的多种场景。基本架构通常包括监控端&#xf…

点灯案例优化(二) 利用位运算修改特定位

前面&#xff0c;我们对点灯代码进行了第一次优化&#xff0c;效果如下 尽管第一次优化以后代码可读性确实高了不少&#xff0c;也看起来更加简洁&#xff0c;但是&#xff0c;这里仍旧存在一个很严重的问题&#xff1a;就在每一个表达式右边&#xff0c;我们给寄存器的数据赋值…

[数据集][目标检测]绳子检测数据集VOC+YOLO格式322张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;322 标注数量(xml文件个数)&#xff1a;322 标注数量(txt文件个数)&#xff1a;322 标注类别…

虹科波形实验室 | 识别振动/敲击方向的方法

熟悉虹科Pico的朋友们都知道&#xff0c;我们的NVH诊断设备可以精确采集三个方向上的振动幅值&#xff0c;并通过软件的自动计算&#xff0c;定位振动来源。但最近收到用户的咨询&#xff0c;问我们NVH设备的振动传感器是否能识别振动的方向&#xff1f;比如Y轴的振动&#xff…

uipath发送邮件给多人:配置教程步骤解答!

uipath发送邮件给多人如何设置&#xff1f;使用uipath发信技巧&#xff1f; 自动化流程能够极大提高工作效率&#xff0c;其中邮件发送作为日常操作的重要组成部分&#xff0c;尤为关键。AokSend将详细介绍如何通过uipath发送邮件给多人&#xff0c;帮助您在自动化流程中更好地…

海康相机触发输入输出(含代码)

海康相机触发模式 软件设置&#xff1a;先设置触发模式&#xff0c;在设置触发源。 目的&#xff1a;模拟编码器发送信号触发相机采集&#xff0c;通过一个矩形波信号触发采集图像。 计数器触发 说明书MSV客户端步骤&#xff1a; 实验过程 1、编码器周长300mm&#xff0c;…

[Leetcode 61][Medium]-旋转链表

目录 一、题目描述 二、整体思路 三、代码 一、题目描述 原题链接 二、整体思路 首先发现这样的规律&#xff1a;当k大于等于链表中节点总数n时&#xff0c;会发现此时旋转后的链表和kk%n时的旋转后的链表一样。同时对于特殊情况n0和n1时&#xff0c;无论k的值为多少都可以…

Unity--XLua调用C#

Unity–XLua调用C# 由于Unity/C# 和lua是两种语言&#xff0c;两种语言的特性不一样&#xff0c;因此&#xff0c;如果要互相调用的话&#xff0c;需要第三方作桥梁. 因此&#xff0c;为了在Unity中/C#中使用lua的特性&#xff0c;需要在Unity中安装插件&#xff0c;Xlua/toLu…

数据结构—— 再探二叉树

1. TOP-K问题 TOP-K问题&#xff1a;求数据结合中前K个最大或者最小的数据 比如&#xff1a;专业前10名、世界500强、富豪榜、游戏中前100的活跃玩家等 思路&#xff1a; 1. 用数据集合中前K个数据来建堆&#xff1a; …

easypoi模板导出word并且合并行

导出流程 引入依赖制作模板合并导出 引入依赖 <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.1.2</version> </dependency>制作模板 合并行是备注那一列&#xff0c;这一列…