https://ac.nowcoder.com/acm/contest/301/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)
输出描述:
输出满足的对数。
输入
6 7
输出
6
说明
(1,6),(2,5),(3,4),(4,3),(5,2),(6,1)
解题思路
方法一: 数学思想,先分别找出1~m和1~n中有多少个7个7的序列,假设分别有a,b个,则这些序列两堆之间可以相互组合,每一种组合共有7种,则共有a*b个组合数。如果m堆剩余c个,n堆剩余d个,则m堆剩余的c个可以和n堆b个序列组合,共有b*c个组合数,同理,n堆剩余的d个可以和m堆a个序列组合,共有a*d个组合数。而c和d也可以组合,这个读者可以自己想一下,这里就不再说了。附上代码:
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
long long n, s, m, ans, a, b;
while (~scanf("%lld%lld", &m, &n))
{
a = m / 7;
b = n / 7;
m = m % 7;
n = n % 7;
ans = a * b * 7 + a * n + b * m;
for (int i = 1; i <= n; i++)
if ((m + i) % 7 == 0)
ans += n - i + 1;
printf("%lld\n", ans);
}
return 0;
}
方法二: 小小的暴力一下,遍历一堆的所有数,找出在另外一堆有多少个数与之对应。例如,n堆中的i在m堆中能找到(m+(i%7))/7个数与之对应。
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
long long n, s, m, ans, a, b;
while (~scanf("%lld%lld", &m, &n))
{
ans = 0;
if (m < n)
swap(m, n);
for (int i = 1; i <= n; i++)
ans += (m + (i % 7)) / 7;
printf("%lld\n", ans);
}
return 0;
}