round 2

冲刺NOIP2017模拟赛R2

 

序列

棋盘

货车

源文件名

sequence

chess

truck

读入文件

sequence.in

chess.in

truck.in

输出文件

sequence.out

chess.out

truck.out

时间限制

1s

3s

1s

空间限制

16MB

256MB

256MB

最终评测时不开启任何优化开关

 

 

序列

经历了上周的惨痛教训,出题人宋伊雪终于意识到了一道送分题的必要性。那么这就是你们看到这道题的原因了!

长话短说,宋伊雪会教你一个生成随机序列的方法,你的目标,是求出这个生成序列的权值最大的连续子串的权值。

输入包含9个正整数A,B,C,D,E,F,A0,B0,n。


在生成好序列之后,对于每个n,如果bn % 2 == 0,那么将an改变为它的相反数。

 

[输入格式]

仅一行9个正整数A,B,C,D,E,F,A0,B0,n。

每个数的含义参考题面,n代表你需要生成的序列长度

 

[输出格式]

仅一行输出权值最大的连续子串的权值。

简单地说,连续子串就是连着的一段数字的意思,可以为空。

注意,答案不需要考虑

 

[样例输入 1]

1 2 3 2 3 5 23 13 5

 

[样例输出 1]

15382354

 

[数据范围]

对于20%的数据,满足1 <= n <= 10

另有40%的数据,满足1 <= n <= 1000

另有20%的数据,满足1 <= n <= 1000000

对于100%的数据,满足1 <= n <= 10000000A,B,C,D,E,F,A0,B0,小于2^31

虽然是道简单的前缀和,只要在计算前缀和的时候顺便更新最小的前缀和,把当前前缀和与这个最小前缀和相减,就可以得到最大的连续子序列。

然而第一次打的时候却意外爆了两个点。

请教钊爷学长后,,

才知道是自己调用了一个传递六个变量的函数,时间复杂度的常数 * 6。

再加上取模操作的运算常数不是1的,于是超了时限。

这里有必要说下,

合理取模。

此题的方程在相加的部分是不会超出 long long 范围的

所以没必要对每步运算都取模

只要相乘操作后取模就行了

科学取模。

顺带一提,取模运算符的优先级是与乘除一档的。。

#include<cstdio>
#include<iostream>
using namespace std;
typedef long long LL;
const LL mo1 = 23333333;
const LL mo2 = 66666666;
LL A,B,C,D,E,F,A0,B0,N;
LL tot,minn,p,q,ans;

/*nline LL js(LL a,LL b,LL c,LL x,LL mo){
	return (a * x % mo * x % mo + b * x % mo + c) %mo; 
}*/

int main(){
	freopen("sequence.in","r",stdin);
	freopen("sequence.out","w",stdout);
	cin >> A >> B >> C >> D >> E >> F >> A0 >> B0 >> N;
	p = A0; q = B0;
	minn = 0; tot = 0; ans = 0;
	for(int i = 1; i <= N; i++){
		p = (A * p % mo1 * p % mo1 + B * p % mo1 + C) % mo1;
		q = (D * q % mo2 * q % mo2 + E * q % mo2 + F) % mo2;  
		if(q % 2 == 0) p = -p;
		tot += p;
		minn = min(tot,minn);
		ans = max(ans,tot - minn);
		if(p < 0) p = -p;
	}
	cout << ans;
	return 0;
}
 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是PRESENT模块的完整代码,其中添加了随机掩码以提高安全性: ``` module PRESENT(res, state, key, mask); input [63:0] state; input [79:0] key; input [63:0] mask; output [63:0] res; wire [63:0] res1, res2, res3, res4, res5, res6, res7, res8, res9, res10, res11, res12, res13, res14, res15, res16; wire [79:0] key1, key2, key3, key4, key5, key6, key7, key8, key9, key10, key11, key12, key13, key14, key15, key16; // Round keys generation gen_keys(key, key1, key2, key3, key4, key5, key6, key7, key8, key9, key10, key11, key12, key13, key14, key15, key16); // Random mask wire [63:0] state_masked = state ^ mask; // Round 1 Round U1(res1, state_masked, key, key1, 5'b00001); // Remove mask wire [63:0] state_unmasked1 = res1 ^ mask; // Round 2 Round U2(res2, state_unmasked1, key1, key2, 5'b00010); // Remove mask wire [63:0] state_unmasked2 = res2 ^ mask; // Round 3 Round U3(res3, state_unmasked2, key2, key3, 5'b00011); // Remove mask wire [63:0] state_unmasked3 = res3 ^ mask; // Round 4 Round U4(res4, state_unmasked3, key3, key4, 5'b00100); // Remove mask wire [63:0] state_unmasked4 = res4 ^ mask; // Round 5 Round U5(res5, state_unmasked4, key4, key5, 5'b00101); // Remove mask wire [63:0] state_unmasked5 = res5 ^ mask; // Round 6 Round U6(res6, state_unmasked5, key5, key6, 5'b00110); // Remove mask wire [63:0] state_unmasked6 = res6 ^ mask; // Round 7 Round U7(res7, state_unmasked6, key6, key7, 5'b00111); // Remove mask wire [63:0] state_unmasked7 = res7 ^ mask; // Round 8 Round U8(res8, state_unmasked7, key7, key8, 5'b01000); // Remove mask wire [63:0] state_unmasked8 = res8 ^ mask; // Round 9 Round U9(res9, state_unmasked8, key8, key9, 5'b01001); // Remove mask wire [63:0] state_unmasked9 = res9 ^ mask; // Round 10 Round U10(res10, state_unmasked9, key9, key10, 5'b01010); // Remove mask wire [63:0] state_unmasked10 = res10 ^ mask; // Round 11 Round U11(res11, state_unmasked10, key10, key11, 5'b01011); // Remove mask wire [63:0] state_unmasked11 = res11 ^ mask; // Round 12 Round U12(res12, state_unmasked11, key11, key12, 5'b01100); // Remove mask wire [63:0] state_unmasked12 = res12 ^ mask; // Round 13 Round U13(res13, state_unmasked12, key12, key13, 5'b01101); // Remove mask wire [63:0] state_unmasked13 = res13 ^ mask; // Round 14 Round U14(res14, state_unmasked13, key13, key14, 5'b01110); // Remove mask wire [63:0] state_unmasked14 = res14 ^ mask; // Round 15 Round U15(res15, state_unmasked14, key14, key15, 5'b01111); // Remove mask wire [63:0] state_unmasked15 = res15 ^ mask; // Round 16 Round U16(res16, state_unmasked15, key15, key16, 5'b10000); // Remove mask res = res16 ^ mask; endmodule ``` 其中的 `mask` 参数为随机掩码,使用 `^` 运算符对输入数据进行掩蔽,然后进行PRESENT加密算法的一轮运算。在每一轮运算结束后,再次使用 `^` 运算符移除随机掩码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值