链接:https://ac.nowcoder.com/acm/contest/301/A
来源:牛客网
题目描述
小乐乐得知一周有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的倍数,也就是说只要找两个数的和是7的倍数就好。所以能想到在 1-n 中找模7 == 1的数,在 1-m中找到模7==6的数,这样的两个数加起来就是7的倍数,所以就有了一个规律
#include <stdio.h>
#include <cstring>
typedef long long ll;
int main() {
ll n, m;
ll sum = 0;
scanf("%lld%lld", &n, &m);
sum += (n/7)*(m/7); // n,m都为7的倍数的情况
sum += ((n+6)/7) * ((m+1)/7); // n的余数为1,m的余数为6的情况 这就是n模7余1的数有多少个,m模7余6的数有多少个 (n+6)/7表示1~(n+6)有多少个是7的倍数 n+6才是7的倍数那么nmod7的余数得要是1才行
sum += ((n+5)/7) * ((m+2)/7); // n的余数为2m的余数为5的情况
sum += ((n+4)/7) * ((m+3)/7); // n的余数为3,m的余数为4的情况
sum += ((n+3)/7) * ((m+4)/7); // n的余数为4,m的余数为3的情况
sum += ((n+2)/7) * ((m+5)/7); // n的余数为5,m的余数为2的情况
sum += ((n+1)/7) * ((m+6)/7); // n的余数为6,m的余数为1的情况
printf("%lld\n", sum);
return 0;
}