codeforces #306 550C C. Divisibility by Eight(同余模定理+枚举)

题目链接:

点击打开链接

题目大意:

给出一个数,问拿走某几位,能否使这个数被8整除(可以选择全部留下)

题目分析:

这道题主要考对同余模定理的理解,整个数mod8

首先看对于第i位上来说相当于 10^(i-1)*digit%8,当i>3时,10^3*10^(i-4)%8 = 0*10^(i-4) = 0

所以只考虑三位数的情况即可,1%8 = 1 , 10%8 = 2 , 100%8 = 4

那么因为取走数之后相对顺序不变,所以我们只需要枚举这三个数,取自哪几位即可,然后判断是否相加取模为0

最后构建的数一定可以作为一个三位数,除非位数不够,或者根本不能构造

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define MAX 107

using namespace std;

int num[MAX];
char s[MAX];


int main ( )
{
    scanf ( "%s" , s ) ;
    int len = strlen(s);
    for ( int i = 0 ; i < len ; i++ )
        num[s[i]-'0']++;
    if ( num[8] ) 
    {
        puts ( "YES" );
        puts ( "8" );
        return 0;
    }
    if ( num[0] )
    {
        puts( "YES" );
        puts( "0" );
        return 0; 
    }
    if ( len == 1 )
    {
        puts("NO");
        return 0;
    }
    for ( int i = len-1 ; i > 0  ; i-- )
        for ( int j = i-1 ; j >= 0 ; j-- )
        {
           int num1 = s[i]-'0';
           int num2 = s[j]-'0';
           if ( (num1*1 + num2*2)%8 == 0 ) 
           {
               puts("YES" );
               printf ( "%d%d\n" , num2 , num1 );
               return 0;
           }
        }
    if ( len == 2 )
    {
        puts("NO");
        return 0;
    }
    for ( int i = len-1 ; i >= 0 ; i-- )
        for ( int j = i-1 ; j >= 0 ; j-- )
            for ( int k = j-1; k >= 0 ; k-- )
            {
                int num1 = s[i]-'0';
                int num2 = s[j]-'0';
                int num3 = s[k]-'0';
                if ( (num1*1 + num2*2 + num3*4)%8 == 0 )
                {
                    puts("YES");
                    printf ( "%d%d%d\n" , num3,num2,num1);
                    return 0;
                }
            }
    puts("NO");
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值