vijos- P1383盗窃-黑珍珠 (python + 代码优化)

P1383盗窃-黑珍珠

背景

怪盗基德 VS OIBH
第二话

描述

今次怪盗基德再次对阵OIBH,目标是Black Star!基德已经突破了数层封锁,到达
了OIBH总部存放Black Star的房间门口。OIBH的人也不是等闲之辈,他们在门上
设了密码。密码问题上只有两个正整数n,m。基德已经获悉密码的生成方法。现
在要你帮他计算出密码。

生成方法是这样的:
设一个数组a[1..n](n即是上述中的n)中按递增存放了1..n这n个数。数组s是
a的子数组(就是集合s为集合a的子集)。而数组s中任意两个数的和都不被m整
除。s中数的数目最大值就是密码!

格式

输入格式

一行两个整数n,m

输出格式

只有一个数max,即密码。

样例1

样例输入1[复制]

50 7

样例输出1[复制]

23

限制

每个点1S

提示

1<=n,m<=10000
很简单哦~~

来源

From 玛维-影之歌;

感谢kaito&aoko提供测试数据

此题的要素:

将1....n对m进行取余

得到了0.....m -1

显然如果0出现过的话,0只能出现一次,

接着可以发现由于取余得到的结果的顺序是如此:0..5..m-1,0...5...m-1

所以在m/2前出现的数肯定比后面的数多,然后又因为x + y == m是不成立的

所以我们只要取m/2范围内的数就可以了


#!/usr/bin/env python3
# -*- coding: utf-8 -*-


import math
n, m = map(int,raw_input().split())
L = []
F = [0] * m
for i in range(1,n + 1):
    F[i % m] += 1
cnt = 0
for i in range(1, m / 2 + 1):
    cnt += F[i]
if F[0]:
    cnt += 1
if m % 2 == 0:
    if F[m / 2]:
        cnt -= F[m / 2] - 1
print cnt


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值