题目:
链接: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 或者两个数与7的余数都为0,这两个数相加是7的倍数
利用这个结论,找出余数分别为0,1,2,3,4,5,6的数的个数,a[i]*a[7-i] 再加上 a[0]*b[0]即为答案
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
int main(){
ll n,m;
ll a[7],b[7];//a[i]表示余数为i的数的个数
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
cin >> n >> m;
ll sum = 0;
int x = n/7,xx = n%7;//x 为 1——n这些数中7的倍数的数的个数,xx 为 n/7余下的数与7的余数
int y = m/7,yy = m%7;
for(int i=0;i<=6;i++){
a[i] += x;
b[i] += y;
}
for(int i=1;i<=xx;i++){
a[i]+=1;
}
for(int i=1;i<=yy;i++){
b[i]+=1;
}
for(int i=1;i<=6;i++){
sum += a[i]*b[7-i];//余数为i和余数为7-i的数相加为7的倍数
}
sum += a[0]*b[0];//前面少加的 两个余数为0的数相加也为7的倍数
cout << sum << endl;
return 0;
}