小乐乐的组合数

链接: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;
} 

猜你喜欢

转载自blog.csdn.net/ru_ruo1/article/details/84727836