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;
}