codeforce 221 Div2 C - Divisible by Seven

codeforce 221 Div2 C - Divisible>

当时做这题的时候,就在想是不是1,6,8,9任意组合是否都能被7整除,后来发现不是,我只是随便挑了几个,发现只有1869和9681能被7整除。。。。后来就往其他方向去想了,假如我发现有两个能被7整除,一定有什么蹊跷或者,我把这24种情况都列出来,可能就可以想到这一点了,,,,,可惜可惜。

其实,只要把这24种情况都列出来我们会发现:


1869%7 = 0        8169%7 = 0        9186%7 = 2     6189%7 = 1

1896%7 = 6        8196%7 = 6        9168%7 = 5     6198%7 = 3

1689%7 = 2        8619%7 = 2        9816%7 = 2     6819%7 = 1

1698%7 = 4        8691%7 = 4        9861%7 = 5     6891%7 = 3

1986%7 = 5        8961%7 = 1        9681%7 = 0     6198%7 = 3

1968%7 = 1        8916%7 = 5        9618%7 = 0     6189%7 = 1


0~6各种余数都有,而且题目告诉我们所有数据一定包括1,6,8,9这四个数;

所以我们只需要计算所有的数,除一个1,6,8,9,其余的余7为多少,假如为n,后面就补上一个1,6,8,9组合后余7为:7-n的数。

也就是说,所有的测试数据都能被7整除,而且排列只需调整后面的1,6,8,9这四个数的顺序即可。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn = 1000006;
char s[maxn];
int ans[8] = {1869,1896,1986,8691,6198,1689,1968};
int main()
{
    while(scanf("%s",s)!=EOF){
        int len = strlen(s);
        int A[10] = {0};
        for(int i=0;i<len;i++){
            A[s[i]-'0']++;
        }
        int m = 0;
        for(int i=1;i<A[1];i++)  {printf("1");m = (m*10 +1)%7;}
        for(int i=1;i<=A[2];i++) {printf("2");m = (m*10 +2)%7;}
        for(int i=1;i<=A[3];i++) {printf("3");m = (m*10 +3)%7;}
        for(int i=1;i<=A[4];i++) {printf("4");m = (m*10 +4)%7;}
        for(int i=1;i<=A[5];i++) {printf("5");m = (m*10 +5)%7;}
        for(int i=1;i<A[6];i++)  {printf("6");m = (m*10 +6)%7;}
        for(int i=1;i<=A[7];i++) {printf("7");m = (m*10 +7)%7;}
        for(int i=1;i<A[8];i++)  {printf("8");m = (m*10 +8)%7;}
        for(int i=1;i<A[9];i++)  {printf("9");m = (m*10 +9)%7;}
        m = (m*10000) % 7 ;
        printf("%d",ans[m]);
        for(int i=1;i<=A[0];i++) printf("0");
        printf("\n");
    }
    return 0;
}




如果你有其他解法,请与我留言,一起进步,多谢!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值