!
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/e88ab5e1c67375073fc17ecf27ccd787.png)
来源:牛客网
时间限制: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);
}
}