ExaWizards 2019 English D - Modulo Operations(DP)
Time Limit: 2 sec / Memory Limit: 1024 MB
Score : 600600 points
Problem Statement
Snuke has a blackboard and a set SS consisting of NN integers. The ii-th element in SS is SiSi.
He wrote an integer XX on the blackboard, then performed the following operation NN times:
- Choose one element from SS and remove it.
- Let xx be the number written on the blackboard now, and yy be the integer removed from SS. Replace the number on the blackboard with xmodyxmody.
There are N!N! possible orders in which the elements are removed from SS. For each of them, find the number that would be written on the blackboard after the NN operations, and compute the sum of all those N!N! numbers modulo 109+7109+7.
Constraints
- All values in input are integers.
- 1≤N≤2001≤N≤200
- 1≤Si,X≤1051≤Si,X≤105
- SiSi are pairwise distinct.
Input
Input is given from Standard Input in the following format:
NN XX
S1S1 S2S2 …… SNSN
Output
Print the answer.
Sample Input 1 Copy
2 19
3 7
Sample Output 1 Copy
3
- There are two possible orders in which we remove the numbers from SS.
- If we remove 33 and 77 in this order, the number on the blackboard changes as follows: 19→1→119→1→1.
- If we remove 77 and 33 in this order, the number on the blackboard changes as follows: 19→5→219→5→2.
- The output should be the sum of these: 33.
Sample Input 2 Copy
5 82
22 11 6 5 13
Sample Output 2 Copy
288
Sample Input 3 Copy
10 100000
50000 50001 50002 50003 50004 50005 50006 50007 50008 50009
Sample Output 3 Copy
279669259
- Be sure to compute the sum modulo 109+7109+7.
题意:
给定一个数x和一个含有n个数的数组。
将数组排成任意顺序(即一共有N!种顺序组合),然后扫一遍数组,x对a[i] 取模,余数代替x,然后对下一个数进行同样的操作。
直到扫完整个数组。最后得到的数是num
然后把所有顺序组合得到的num全加起来就是ans,需要对1e9+7取模。
思路:
通过分析我们可以知道,
当数组的一个数a[i]前面有一个数a[x],并且a[x] 比 a[i] 小。那么我们分析上面的取余操作可以知道a[i]其实对答案没有任何影响。
因为在对a[i]取余之前的数值x,已经比a[i]小了,因为对a[x]取余过了,一个小数对大数取余,没有改变的。
那么我们对数组从大到小排序后,
定义dp[i][j] 表示,排列了前i个数后,当前值x为j的所有情况数。
转移有两种,
如果a[i] 数放在 i位置,
那么我们知道他对i位置 j%a[ i ] 的贡献是上一个位置i-1的j的数量。
如果a[i] 不放在这个位置。
它放在后面的n-i的任意位置都可以,而且对当前位置i的j即dp[i][j]的贡献就是dp[i-1][j] ,因为这一位的 a[i] 没有影响。
细节见代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define ALL(x) (x).begin(), (x).end()
#define rt return
#define dll(x) scanf("%I64d",&x)
#define xll(x) printf("%I64d\n",x)
#define sz(a) int(a.size())
#define all(a) a.begin(), a.end()
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define eps 1e-6
#define gg(x) getInt(&x)
#define db(x) cout<<"== [ "<<x<<" ] =="<<endl;
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
ll powmod(ll a,ll b,ll MOD){ll ans=;while(b){if(b%)ans=ans*a%MOD;a=a*a%MOD;b/=;}return ans;}
inline void getInt(int* p);
const int maxn=;
const int inf=0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/
int a[maxn];
int n;
int x;
ll dp[][];
const ll mod=1e9+;
int main()
{
//freopen("D:\\common_text\\code_stream\\in.txt","r",stdin);
//freopen("D:\\common_text\\code_stream\\out.txt","w",stdout);
gbtb;
cin>>n>>x;
repd(i,,n)
{
cin>>a[i];
}
sort(a+,a++n,[&](int x,int y){return x>y;});
dp[][x]=;
repd(i,,n)
{
repd(j,,x)
{
dp[i][j%a[i]]+=dp[i-][j];
dp[i][j%a[i]]=(dp[i][j%a[i]]+mod)%mod;
dp[i][j]+=dp[i-][j]*(n-i)%mod;
dp[i][j]=(dp[i][j]+mod)%mod;
}
}
ll ans=0ll;
repd(i,,x)
{
ans+=(dp[n][i]*i)%mod;
ans=(ans+mod)%mod;
}
cout<<ans<<endl; return ;
} inline void getInt(int* p) {
char ch;
do {
ch = getchar();
} while (ch == ' ' || ch == '\n');
if (ch == '-') {
*p = -(getchar() - '');
while ((ch = getchar()) >= '' && ch <= '') {
*p = *p * - ch + '';
}
}
else {
*p = ch - '';
while ((ch = getchar()) >= '' && ch <= '') {
*p = *p * + ch - '';
}
}
}
ExaWizards 2019 English D - Modulo Operations(DP)的更多相关文章
- jzoj6009. 【THUWC2019模拟2019.1.18】Counting (dp)
Description 羽月最近发现,她发动能力的过程是这样的: 构建一个 V 个点的有向图 G,初始为没有任何边,接下来羽月在脑中构建出一个长度为 E 的边的序列,序列中元素两两不同,然后羽月将这些 ...
- 2019湘潭校赛 H(dp)
题目传送 dp是常规的:\(m^2\)的预处理:把位置存进vector然后\(O(1)\)算出想要的:WA点:要注意特意设置一下val[i][v.size()]=0,即全天都放鸽子则花费时间为0. # ...
- [贪心,dp] 2019中国大学生程序设计竞赛(CCPC) - 网络选拔赛 Fishing Master (Problem - 6709)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=6709 Fishing Master Time Limit: 2000/1000 MS (Java/Othe ...
- HDU 5938 Four Operations(四则运算)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
- LightOJ 1033 Generating Palindromes(dp)
LightOJ 1033 Generating Palindromes(dp) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...
- lightOJ 1047 Neighbor House (DP)
lightOJ 1047 Neighbor House (DP) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87730# ...
- UVA11125 - Arrange Some Marbles(dp)
UVA11125 - Arrange Some Marbles(dp) option=com_onlinejudge&Itemid=8&category=24&page=sho ...
- GAITC 2019全球人工智能技术大会(南京)
2019年5月25日至26日,由中国人工智能学会主办,以“交叉.融合.相生.共赢”为主题的2019GAITC将在南京全新亮相. 2019 全球人工智能技术大会(2019 GAITC)以“前端引领.深度 ...
- 【POJ 3071】 Football(DP)
[POJ 3071] Football(DP) Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4350 Accepted ...
随机推荐
- 一统江湖的大前端(6)commander.js + inquirer.js——懒,才是第一生产力
<一统江湖的大前端>系列是自己的前端学习笔记,旨在介绍javascript在非网页开发领域的应用案例和发现各类好玩的js库,不定期更新.如果你对前端的理解还是写写页面绑绑事件,那你真的是有 ...
- 第15章 使用EntityFramework Core进行配置和操作数据 - Identity Server 4 中文文档(v1.0.0)
IdentityServer旨在实现可扩展性,其中一个可扩展点是用于IdentityServer所需数据的存储机制.本快速入门展示了如何配置IdentityServer以使用EntityFramewo ...
- Go中变量作用域的小坑
直接上一实例: package main import "fmt" func main(){ fmt.Println("for start") ; a < ...
- PHP中利用pcntl实现多进程(模拟多线程)实例(转)
windows不支持pcntl的多线程(非Unix类系统不支持此模块),pcntl在很久很久之前就听过了,但是一直没有尝试着真正要用它. 这不,遇到socket问题了,看socket,遇到pcntl了 ...
- mysql删除重复记录,只保留最大ID的记录(非重复也保留)
目前网上搜索的删除重复记录,大部分都是where子查询,本人感觉看上去不美观,故亲自手写了一个,如下: delete from mst_sku using mst_sku,( select dist ...
- JavaWeb - 模仿SpringMVC抽取 BaseServlet + 封装表单参数
模仿SpringMVC抽取一个BaseServlet,接收所有请求,然后自动封装表单参数和分发到对应的servlet执行,下面用一个页面表单提交,转发显示的项目做示例. 1)首先准备一个Entity, ...
- noi.ac #289. 电梯(单调队列)
题意 题目链接 Sol 傻叉的我以为给出的\(t\)是单调递增的,然后\(100\rightarrow0\) 首先可以按\(t\)排序,那么转移方程为 \(f[i] = min_{j=0}^{i-1} ...
- 使用C++对物理网卡/虚拟网卡进行识别(包含内外网筛选)
简介 在Socket编程的时候,我们需要实时获取我们所需要的IP地址.例如在编写后门的时候,我们可能需要获得有效的外网IP或内网IP:有时候我们可能需要判断我们获取的是否是虚拟机网卡,这时候就需要对每 ...
- 统计 flv视频总时长
在学习孟媛的视频课程.网上能下载的是flv格式.那我在学习之前,我要统计一下这个课程的数量,他会用多长时间,这样方便我在学习过程中不断的回顾,进行时间管理.我大概就可以统计出来这个视频多长时间可以学完 ...
- 3星|《给产品经理讲技术》:APP开发技术介绍,没有技术背景的话恐怕只能看懂书中的比喻和结论
基本是APP开发涉及到的相关技术的入门级介绍.涉及到的知识点与技术细节比较多,不少技术相关的内容并没有像标题暗示的那样没有技术背景也可以看懂,而是涉及到许多专业的术语.原理.也有一些内容是用比喻的方法 ...