哈尔滨理工大学软件与微电子学院第八届程序设计竞赛同步赛(高年级) 小乐乐的组合数+

题目:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值