首页 > 其他分享 >P1350 车的放置

P1350 车的放置

时间:2024-07-16 17:29:18浏览次数:11  
标签:include int res 1ll 放置 P1350 矩形 mod

P1350 车的放置 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

非递推做法,对于这个题,这个图形之间统计很麻烦,由此我们可以把它分成两个矩形。如直接沿 \(b\) 边切割。但这样我们发现还是不好统计,因为左边矩形会受到右边不一定的限制,于是沿着 \(b,c\) 边再次切割,分成三个矩形,从上到下矩形标号为 \(1,2,3\)。可以发现 \(1,3\) 没有任何关系,而 \(1,3\) 同时影响 \(2\)。

先看看没有影响的 \(1,3\),对于一个矩形,放置方案可以为先选 \(k\) 个横坐标,再选 \(k\) 个纵坐标,最后排列这 \(k\) 对坐标,具体为何自己试试。

接下来看看 \(2\),假设 \(1,3\) 分别放了 \(k_1, k_2\) 个车,那么 \(2\) 将有分别有 \(k_1,k_2\) 行横纵坐标不能使用。去掉这些不能用的行就变成了一个 \(a-k_1,b-k_2\) 的矩形,而这个新矩形也就和 \(1,3\) 没有影响了,按他们的方式求出来。

最后把 \(1,2,3\) 的方案乘起来就是当前状态(每个矩形放几个车)的方案数。把所有方案加起来就是最终答案。

注意要预处理逆元,阶乘,否则时间不够。

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

using namespace std;

const int N = 1010, mod = 1e5 + 3;

int n, m, k;
int a, b, c, d;
int f[N], in_f[N];

int qmi(int a, int k, int p)
{
    int res = 1;
    
    while (k)
    {
        if (k & 1) res = (1ll * res * a) % p;
        k >>= 1;
        a = 1ll * a * a % p;
    }
    
    return res;
}

int get(int x) // 获取逆元,这里利用费马小定理
{
    return qmi(x, mod - 2, mod);
}

int get2(int a, int b) // 组合数
{
    return 1ll * f[a] * in_f[a - b] % mod * in_f[b] % mod;
}

int get3(int a, int b, int k) // 为了方便
{
    return 1ll * f[k] * get2(a, k) % mod * get2(b, k) % mod;
}

int main()
{
    cin >> a >> b >> c >> d >> k;
    
    f[0] = 1;
    in_f[0] = get(f[0]);
    for (int i = 1; i <= 1000; i ++ )
    {
        f[i] = 1ll * f[i - 1] * i % mod;
        in_f[i] = get(f[i]);
        // cout << 1ll * in_f[i] << ' ' << get(f[i]) % mod << endl;
    }
    
    int t3 = 0;
    
    for (int i = 0; i <= k; i ++ )
    {
        if (a < i || b < i) continue;
        for (int j = 0; j <= k - i; j ++ )
        {
            if (c < j || d < j) continue;
            int x = a - i, y = d - j, z = k - i - j;
            if (x < 0 || y < 0 || z > x || z > y) continue;
        
            t3 = (1ll * t3 + 1ll * get3(x, y, z) * get3(a, b, i)  % mod * get3(c, d, j) % mod) % mod;
            // printf("%d %d %d\n", i, j, t3);
        }
    }
    cout << t3;
    
    return 0;
}

标签:include,int,res,1ll,放置,P1350,矩形,mod
From: https://www.cnblogs.com/blind5883/p/18305753

相关文章

  • 在Java、Java Web中放置图片、视频、音频、图像文件的方法
    在Java软件中放置图片,通常涉及将图片文件(如JPEG、PNG等)作为资源包含在我们的项目中,并在代码中通过适当的方式引用这些资源。这可以通过多种方式实现,但最常见的是在Java桌面应用(如Swing或JavaFX)或Web应用(如Servlet/JSP)中。1.如何在Java中如何放置图片以下是一个在JavaSwing桌......
  • 在Java、Java Web中放置图片、视频、音频、图像文件的方法
    在Java软件中放置图片,通常涉及将图片文件(如JPEG、PNG等)作为资源包含在我们的项目中,并在代码中通过适当的方式引用这些资源。这可以通过多种方式实现,但最常见的是在Java桌面应用(如Swing或JavaFX)或Web应用(如Servlet/JSP)中。1.如何在Java中如何放置图片以下是一个在JavaSwing桌面......
  • 【无人机】无人机(UAV)在无线网络的最优放置问题研究【高效本地地图搜索算法】(Matlab代
     ......
  • Leetcode 3161. 物块放置查询
    https://leetcode.cn/problems/block-placement-queries/description/有一条无限长的数轴,原点在0处,沿着x轴正方向无限延伸。给你一个二维数组queries,它包含两种操作:操作类型1:queries[i]=[1,x]。在距离原点x处建一个障碍物。数据保证当操作执行的时候,位置x处......
  • AD放置定位孔的一些技巧
    1.首先在机械1层可以看到已经设计好了板框和定位孔位置为了方便统一管理,可以新建一个机械层,将孔放置在新的机械层(可能是为了方便打板)按L键并在机械1层右键添加机械15层(约定俗成)再框选定位孔设置到新建的机械层2.然后在keepout层在定位孔周围放一个稍大的圆keepout是防......
  • 2320. 统计放置房子的方式数
    题目链接:本题和198.打家劫舍有异曲同工之妙。由于街道两侧互不干扰,因此可以考虑只计算出一侧的状态,然后利用乘法原理即可。状态划分时,考虑第\(i\)个地块选或不选:若选,则第\(i-1\)个地块不能选,第\(i-2\)个地块可选可不选。\(f[i]=f[i-2]\)若不选,则第\(i-1\)个地块可......
  • 你真的了解回调函数吗?(文章最后放置源码)
    一、什么是回调函数简单来说就是通过函数指针调用的函数。复杂一些呢就是说将函数的指针(地址)作为参数传递给另外一个函数使用,当这个指针被用来调用其指向的函数的时候被调用的函数就是回调函数。二、回调函数怎么使用1、在学习回调函数之前我们是如何进行运算的我们来看下......
  • 洛谷 P9237 [蓝桥杯 2023 省 A] 像素放置
    题意:n*m的方格,有的格子是数字,是数字的格子代表了相邻(包括自己)的9个格子内颜色值为1的格子有这么多个。给出这个方格,求满足条件的颜色方格,保证答案唯一。n<=10,m<=10。思路:想不出好办法,直接暴力+剪枝。暴力好说,01dfs即可,关键是如何剪枝。剪枝肯定是已经不会再变动颜色的......
  • .NET分布式Orleans - 3 - Grain放置
    在Orleans7中,Grain放置是指确定将Grain对象放置在Orleans集群中的哪些物理节点上的过程。Grain是Orleans中的基本单位,代表应用程序中的逻辑单元或实体。Grain放置策略是一种机制,用于根据不同的因素,将Grain对象放置在合适的节点上,以实现负载均衡、最小化网络延迟和提高容错性。G......
  • P1240+P1350+ AT_abc282_g得出的一些dp技巧
    在遇到一些题目在设状态时,前面的状态对后面的有影响,比如在P1240和P1350中前面的放置会对后面的有影响,正常的状态是不行的。以前可能考虑状态压缩,但现在我们可以通过发现前面状态的一些共性,比如在P1240+P1350中前面放了k个車那么一定有k行被占用,所以就不用记录之前那些行被占用了。......