哈尔滨理工大学软件与微电子学院院赛高年级组A

!


在这里插入图片描述

题目链接

来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述

​ 小乐乐得知一周有7天之后就对7产生了兴趣。

​ 小乐乐得到了两堆数字数字时连续的。

​ 第一堆包含[1,n]n个数字,第二堆包含[1,m]m个数字。

​ 小乐乐想要从两堆中各挑选出一个整数x,y,使得x,y的和为7的倍数。

  请问小乐乐有多少种组合的方式。  

输入描述:

输入整数n,m。(1<=n,m<=1e6)

输出描述:

输出满足的对数。

示例1

输入

复制

6 7

输出

复制

6

说明

(1,6),(2,5),(3,4),(4,3),(5,2),(6,1)

题解

​ 一开始智障了,考虑7的倍数之间的关系,然后暴力打了个表,断断续续的看了半天,

也没检查有没有错误,结果表打错了,还推了半天直接gg,最后才想明白怎么处理,

举个例子,我们要是暴力的处理就是 n^2 的 第一层枚举i,第二层枚j,然后 (i+j)%7==0

对吧,然后我们在去像怎么优化,举个例子 比如 1 29 里面有 1 6 ,1 13,1 20,1 27

我们可以写一下数学公式,设x,7*x - i <= m 我们可以得到这个公式,里面x代表的是

7的几倍也就是几组7的倍数,要想x得到的最大 就取等于呗,化简公式:x = (m+i)/7;

然后只需要遍历一遍1-min(n,m),枚举i就可以了,然后还有一个注意点就是公式要变成

x = (m+i)/7 - i/7 ; 举个例子 25 26 i = 7的时候 x 按照之前的结果是 4 但是实际只有 3个

因为你把 i/7 的情况多算了 就相当于多了一个 0 7 所以 要减去i自身的情况


代码

#include<stdio.h>
#include<algorithm>
#define ll long long
using namespace std;
int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m)==2)
    {
        ll sum = 0;
        int minx = min(n,m);
        int maxn = max(n,m);
        for(int i=1;i<=minx;i++)
        {
            sum+=((maxn+i)/7-i/7);
            //printf("%d %d\n",i,((maxn+i)/7-i/7));
        }
        printf("%lld\n",sum);
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值