Problem G. Generators

Input ﬁle: generators.in

Output ﬁle: generators.out
Little Roman is studying linear congruential generators — one of the oldest and best known pseudorandom number generator algorithms. Linear congruential generator (LCG) starts with a non-negative integer number x0 also known as seed and produces an inﬁnite sequence of non-negative integer numbers xi (0 ≤ xi < c) which are given by the following recurrence relation:
xi+1 = (axi + b) mod c
here a, b, and c are non-negative integer numbers and 0 ≤ x0 < c. Roman is curious about relations between sequences generated by diﬀerent LCGs. In particular, he has n diﬀerent LCGs with parameters a(j), b(j), and c(j) for 1 ≤ j ≤ n, where the j-th LCG is generating a sequence x(j) i . He wants to pick one number from each of the sequences generated by each LCG so that the sum of the numbers is the maximum one, but is not divisible by the given integer number k. Formally, Roman wants to ﬁnd integer numbers tj ≥ 0 for 1 ≤ j ≤ n to maximize s =Pn j=1 x(j) tj subject to constraint that s mod k 6= 0. Input The ﬁrst line of the input ﬁle contains two integer numbers n and k (1 ≤ n ≤ 10000, 1 ≤ k ≤ 109). The following n lines describe LCGs. Each line contains four integer numbers x(j) 0 , a(j), b(j), and c(j) (0 ≤ a(j),b(j) ≤ 1000, 0 ≤ x(j) 0 < c(j) ≤ 1000). Output If Roman’s problem has a solution, then write on the ﬁrst line of the output ﬁle a single integer s — the maximum sum not divisible by k, followed on the next line by n integer numbers tj (0 ≤ tj ≤ 109) specifying some solution with this sum. Otherwise, write to the output ﬁle a single line with the number −1.
Sample input and output
2 3

1 1 1 6

2 4 0 5

8

4

1

2 2

0 7 2 8

2 5 0 6

-1

In the ﬁrst example, one LCG is generating a sequence 1, 2, 3, 4, 5, 0, 1, 2, ..., while the other LCG a sequence 2, 3, 2, 3, 2, ....

In the second example, one LCG is generating a sequence 0, 2, 0, 2, 0, ..., while the other LCG a sequence 2, 4, 2, 4, 2, ....

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <vector>
using namespace std;
const int maxn=1e6+;
const int mm=;
bool vis[maxn];
int f1[maxn],f2[maxn];
int main()
{
freopen("generators.in","r",stdin);
freopen("generators.out","w",stdout);
int n,k,ans=,tmp=mm,flag=-;
scanf("%d%d",&n,&k);
for(int i=; i<n; i++)
{

int x,a,b,c;
scanf("%d%d%d%d",&x,&a,&b,&c);
for(int j=; j<c; j++)
vis[j]=;
vector <int> data;
for(int j=; j<c; j++)
{
if(vis[x]) break;
vis[x]=;
data.push_back(x);
x=(a*x+b)%c;
}
int max1=-,max1i=-;
for (int i = ; i < data.size(); i++)
{
if (data[i] > max1)
{
max1 = data[i];
max1i = i;
}
}
ans+=max1;
int max2=-,max2i=-;
int tmp2=max1%k;
for (int i = ; i < data.size(); i++)
{
if (data[i] > max2&&(data[i]%k)!=tmp2)
{
max2 = data[i];
max2i = i;
}
}
f1[i]=max1i;
f2[i]=max2i;
int minn=max1-max2;
if(max2i!=-&&minn<tmp)
{
tmp=minn;
flag=i;
}
//cout<<max1<<"   "<<max2<<endl;
}
if(ans%k==&&flag==-)
{
cout<<-<<endl;
}
else if(ans%k==)
{
f1[flag]=f2[flag];
ans-=tmp;
cout<<ans<<endl;
for(int i=;i<n-;i++)
cout<<f1[i]<<" ";
cout<<f1[n-]<<endl;
}
else
{
cout<<ans<<endl;
for(int i=;i<n-;i++)
cout<<f1[i]<<" ";
cout<<f1[n-]<<endl;
}
return ;
}

## Gym 100851G Generators (vector+鸽笼原理)的更多相关文章

1. CodeChef February Challenge 2018 Points Inside A Polygon （鸽笼原理）

题目链接  Points Inside A Polygon 题意  给定一个$n$个点的凸多边形,求出$[ \frac{n}{10}]\$个凸多边形内的整点. 把$n$个点分成$4$类: 横坐标奇, ...

2. 1393 0和1相等串 鸽笼原理 || 化简dp公式

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1393 正解一眼看出来的应该是鸽笼原理.记录每个位置的前缀和,就是dp[i ...

3. Codeforce-Ozon Tech Challenge 2020-C. Kuroni and Impossible Calculation(鸽笼原理）

To become the king of Codeforces, Kuroni has to solve the following problem. He is given n numbers a ...

4. HDU 5762 Teacher Bo (鸽笼原理) 2016杭电多校联合第三场

题目:传送门. 题意:平面上有n个点,问是否存在四个点 (A,B,C,D)(A<B,C<D,A≠CorB≠D)使得AB的横纵坐标差的绝对值的和等于CD的横纵坐标差的绝对值的和,n<1 ...

5. POJ_1065_Wooden_Sticks_(动态规划,LIS+鸽笼原理)

描述 http://poj.org/problem?id=1065 木棍有重量 w 和长度 l 两种属性,要使 l 和 w 同时单调不降,否则切割机器就要停一次,问最少停多少次(开始时停一次). Wo ...

6. poj 3370 鸽笼原理知识小结

中学就听说过抽屉原理,可惜一直没机会见识,现在这题有鸽笼原理的结论,但其实知不知道鸽笼原理都可以做 先总结一下鸽笼原理: 有n+1件或n+1件以上的物品要放到n个抽屉中,那么至少有一个抽屉里有两个或两 ...

7. poj 2356鸽笼原理水题

关于鸽笼原理的知识看我写的另一篇博客 http://blog.csdn.net/u011026968/article/details/11564841 (需要说明的是,我写的代码在有答案时就输出结果了 ...

8. UVA 10620 - A Flea on a Chessboard（鸽笼原理）

UVA 10620 - A Flea on a Chessboard 题目链接 题意:给定一个跳蚤位置和移动方向.如今在一个国际象棋棋盘上,左下角为黑格,一个格子为s*s,推断是否能移动到白格子.问要 ...

9. Gym - 100851G：Generators（人尽皆知但是WA题）

题意:现在有函数,每一项Xi=(A*X(i-1)+B)%C.现在给定N个函数以及K:X0,A,B,C.然你再每个函数选择一个数,使得其和最大,而且不被K整除. X0,A,B,C<=1e3 :K& ...

## 随机推荐

1. SQL（触发器）

触发器语法格式(实例): ALTER TRIGGER tri_edituserON dbo.sys_UserFOR INSERT,UPDATE,DELETEAS BEGIN ---判断是新增?修改?删 ...

2. GTAC 2015 Schedule

3. awk 解析maps文件中的地址

maps文件一般是这个样子: pi@raspberrypi:~ \$ sudo cat /proc//maps 54b88000-54c8d000 r-xp b3: /lib/systemd/syste ...

4. jQuery选择器之表单对象属性过滤选择器Demo

测试代码: 08-表单对象属性过滤选择器.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...

5. [置顶] Android Journal

==================================================================================================== ...

6. input(Text)控件作为填空输入,但运行后,有曾经输入的记录显示,用autocomplete=&quot;off&quot;解决

系统中,有设计填空题,原来程序中,用input(Text)控件,   <input type="text" name="NO<%=rs("id&qu ...

7. lumen框架学习01——引入自定义类和函数

引入自定义的functions.php文件,首先把functions.php文件放在app的目录下,然后通过根目录的composer.json文件引入,具体操作如下图: 引入类文件也是一样,具体可参考 ...

8. 2017秋季面向对象程序设计（Java）教材、教学纲要、考核要求

教材简况 凯 S.霍斯特曼 (Cay S. Horstmann)(作者), 周立新(译者), Java核心技术(卷1):基础知识(原书第10版) , 2016年9月1出版 本书包括两卷,选做教材的是卷 ...

9. webservice(一) 概念

Web service:是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述.发布.发现.协调和配置这些应用程序,用于开发分 ...

10. POJ 1949 Chores （很难想到的dp）

传送门: http://poj.org/problem?id=1949 Chores Time Limit: 3000MS   Memory Limit: 30000K Total Submissio ...