链接: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)
输出描述:
输出满足的对数。
示例1
输入
6 7
输出
6
说明
(1,6),(2,5),(3,4),(4,3),(5,2),(6,1)
AC码:
mmmm,很不想写注释,o(╥﹏╥)o,因为不知道怎么写,能不能写清楚。最终决定还是写吧!!!
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int main(){
//注意,整数类型为long long int
long long int m,n,i,j,k;
long long int res;
long long int fir[8]={0},sec[8]={0};
cin>>m>>n;
/*以m为例,将两组数分别放在长度为8的数组中,
fir[i]表示m%7==i ,即星期i有fir[i]天
因为要从两堆数中各挑一个数使其和为7,
设k=m/7,则m天中有完整的k个星期,fir[1]到fir[7]都为k,
设j=m%7,则最后一个星期中只有前j天,fir[1]到fir[j]都加1 ;
若要两个数的和为7的倍数,则只要它们的余数和为7或余数都为7即可。
*/
j=m%7;
k=m/7;
for(i=1;i<=j;i++){
fir[i]=k+1;
}
for(i=j+1;i<=7;i++){
fir[i]=k;
}
j=n%7;
k=n/7;
for(i=1;i<=j;i++){
sec[i]=k+1;
}
for(i=j+1;i<=7;i++){
sec[i]=k;
}
res=0;
for(i=1;i<=6;i++){
j=7-i;
res+=(fir[i]*sec[j]);
}
//注意: 两个都是星期日时也满足条件
res+=(fir[7]*sec[7]);
cout<<res;
return 0;
}