首页 > 其他分享 >[USACO09MAR]Cow Frisbee Team S

[USACO09MAR]Cow Frisbee Team S

时间:2023-06-02 23:33:14浏览次数:62  
标签:取模 le 头牛 Cow int USACO09MAR Frisbee 奶牛 mod

[USACO09MAR]Cow Frisbee Team S

题目描述

老唐最近迷上了飞盘,约翰想和他一起玩,于是打算从他家的 \(N\) 头奶牛中选出一支队伍。

每只奶牛的能力为整数,第 \(i\) 头奶牛的能力为\(R_i\) 。飞盘队的队员数量不能少于 \(1\)、大于\(N\)。一支队伍的总能力就是所有队员能力的总和。

约翰比较迷信,他的幸运数字是 \(F\) ,所以他要求队伍的总能力必须是 \(F\) 的倍数。请帮他

算一下,符合这个要求的队伍组合有多少?由于这个数字很大,只要输出答案对 \(10^8\) 取模的值。

输入格式

第一行:两个用空格分开的整数:\(N\) 和 \(F\)。

第二行到 \(N+1\) 行:第 \(i+1\) 行有一个整数\(R_i\) ,表示第 \(i\) 头奶牛的能力。

输出格式

第一行:单个整数,表示方案数对 \(10^8\) 取模的值。

样例 #1

样例输入 #1

4 5 
1 
2 
8 
2

样例输出 #1

3

提示

数据范围与约定

  • 对于 \(100\%\) 的数据,\(1 \le N \le 2000\),\(1 \le F \le 1000\) ,\(1 \le R_i \le 10^5\) 。

解析

这就是一个类似于\(01\)背包的问题。对于每头牛都有取和不取两种选择。

用\(h[i][j]\)表示在前\(i\)头牛中选择,所选数之和\(mod \ F\)结果为\(j\)的方案数。(以下用“和为\(j\)”表示“和\(mod \ F\)结果为\(j\)”。)

  • 若不取\(i\),则应在前\(i-1\)头牛中取来若干和为\(j\)的数,方案数即为\(h[i-1][j]\)。
  • 若取\(i\),则应在前\(i-1\)头牛中取来若干和为\(j-r[i]\)的数,这样加上\(r[i]\)后,和才能等于\(j\),即\(h[i-1][j-r[i]]\)。

所以$$h[i][j]=h[i][j]+h[i-1][j]+h[i-1][j-r[i]]$$

这里还有一个关于取模的问题要解决。我们要用到的只是\(r[i] \ mod \ F\)的余数,所以输入时就先将\(r[i]\)对\(F\)取模。
还有就是\(j-r[i]\)可能为负数,这时就得写成(j-r[i]+F)%F,就为正了。

初始化\(h[i][r[i]]\)为\(1\)。

AC代码

#include <bits/stdc++.h>
const int p=1e8;//定义常数
using namespace std;
int n,f,r[2010];
long long h[2010][1010];
int main()
{
	cin >> n >> f;
	for(int i=1;i<=n;i++)
	{
		cin >> r[i];
		r[i]%=f;//提前取模
	}
	for(int i=1;i<=n;i++) 
	{
		h[i][r[i]]=1;//初始化
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<f;j++)//余数范围:0到f-1
		{
			h[i][j]=((h[i][j]+h[i-1][j])%p+h[i-1][(j-r[i]+f)%f])%p;//每加一次就%p
		}
	}
	cout<<h[n][0]<<endl;
	return 0;
}

标签:取模,le,头牛,Cow,int,USACO09MAR,Frisbee,奶牛,mod
From: https://www.cnblogs.com/momotrace/p/p2946.html

相关文章

  • Tallest Cow(最高的牛)poj3263
    题目描述:FJ'sN(1≤N≤10,000)cowsconvenientlyindexed1..Narestandinginaline.Eachcowhasapositiveintegerheight(whichisabitofsecret).YouaretoldonlytheheightH(1≤H≤1,000,000)ofthetallestcowalongwiththeindexIoftha......
  • P1676 [USACO05FEB] Aggressive cows G 题解
    题目传送门解题思路最大值最小化问题,考虑二分答案。首先要排序,保证序列单调不降,然后求出两个隔间之间的距离。sort(a+1,a+1+n);for(rii=1;i<=n;i++) dis[i]=a[i+1]-a[i];二分出一个\(mid\),判断它是否合法:每次累加距离,如果距离和比\(mid\)大,说明当前可以分配牛,记录数量......
  • NC51101 Lost Cows
    题目链接题目题目描述\(N(2\leqN\leq8,000)\)cowshaveuniquebrandsintherange1..N.Inaspectaculardisplayofpoorjudgment,theyvisitedtheneighborhood'wateringhole'anddrankafewtoomanybeersbeforedinner.Whenitwastimetoli......
  • P1345 [USACO5.4]奶牛的电信Telecowmunication 题解
    一、题目描述:n个点,m条边,给定起点s和终点t,求最少删去几个点后,s和t不连通。注意,s和t不能删掉。1<=n<=100,1<=m<=600; 二、解题思路:刚刚学了最大费用流,知道最大流等于最小割。但此题割的不是边,是点。我们需要将将割点转化为割边。把一个点切成两半......
  • 【题解】XX Open Cup, GP of Moscow
    //createdon23.03.26目录A.AliceandBobB.BracketsC.CirclesD.DejaVuE.EasiestSumF.FunnySalesmanG.GraphColoringH.HiddenGraphI.InsectsJ.JoiningPointsA.AliceandBob对于链上的情况,异色点是一定不会选择走进同色段的(长度不小于\(2\)),因为一定不优。......
  • Codeforces Round #225 (Div. 2) C. Milking cows Greedy
    Iahubhelpshisgrandfatheratthefarm.Todayhemustmilkthecows.Therearencowssittinginarow,numberedfrom1tonfromlefttoright.Eachcowiseitherfacingtotheleftorfacingtotheright.WhenIahubmilksacow,allthecowsthatseet......
  • Hungry Cow(USACO23 FEB Bronze T1)
    题目: 来写周练了,这道题目开开胃,就只用遍历一遍b数组、d数组再加上一些特判即可程序:#include<bits/stdc++.h>usingnamespacestd;constintN=1e5+10;longlongn,t,d[N],b[N];intmain(){ios::sync_with_stdio(false);cin>>n>>t;for(inti=1;i<=n;i++)......
  • 3分钟了解Hudi数据表类型——COW和MOR
    COW(Copy-On-Write)和MRO(Merge-On-Read)是Hudi中两种不同类型的表,它们的主要区别在于读写操作的性能以及内存占用。1.COW(Copy-On-Write)COW表是在写入操作时进行复制的表,每次写入操作都会创建一个新的COW表,并将原表覆盖。COW表的主要优点是可以减少内存占用和提高写入......
  • 题解 P9130 【[USACO23FEB] Hungry Cow P】
    赛时开始一眼线段树分治,交了几发都T了,就意识到事情不对。后来想了想发现势能分析不能带撤销。。。后来加了一些不能改变复杂度假了的优化,没过之后就自闭跑路了。。。赛后听别人说了个楼房重建就明白怎么做了。首先,我们离线下来把\(a\)排序,去重(这样方便一点,不然权值线段树上......
  • 一千个需求如何快速排序?MoSCoW排序法用上了!【No.2】
    什么是MoSCoW排序法?莫斯科排序法是一种优先级排序法,用于管理需求、任务或功能列表。该方法可以帮助团队确定哪些需求、任务或功能是最重要的,并决定在特定时间段内是否需要完成它们。所以在对需求进行排序时,可以从以下维度考虑:能为业务目标产出高价值的需求优先做;节省时间、人......