Nikifor 3(ural 1095)

1095. Nikifor 3

Time limit: 1.0 second
Memory limit: 64 MB
Nikifor knows that a certain positive integer has in its decimal form each of the digits 1,2,3,4. You are asked to determine if Nikifor can rearrange the digits of the number in such a way that the new number divides by 7.

Input

The first line contains the number  N (not exceeding 10000) of positive integers that are to be checked. The next  N lines contain these integers. Each number has no more than 20 digits.

Output

For each of the  N numbers output a number divisible by 7 that can be obtained from the corresponding number from the input data by a rearrangement of the digits. If such rearrangement does not exist you should output 0 in the corresponding line. In the case of several valid rearrangements you may find only one of them.

Sample

input output
2
1234
531234
4123
354123


题意是给你一个数位不超过20的数,让你把各个位置上的数字重新排列一下形成一个能被7整除的新数,并且保证一定含有数字1,2,3,4。

ural上的题目,具体做法是参照小黑书的(P220),首先把1,2,3,4各提一个出来,让剩下的数字随便排序(有0不能放在前面),让这个排序好的数k*10000mod7,会得到7种可能,即0~6,因为(k*10000+s(提出来的1,2,3,4组成的数))mod7 == ((k * 10000)mod7 + s)mod7。所以再根据k*10000mod7的值来确定s就OK了。

我是当k*10000mod7为0~6时s的值分别是3241,2134,1342,1243,2341,1234,1324,具体看代码。

<span style="font-size:18px;">#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
int p[7] = { 3241, 2134, 1342, 1243, 2341, 1234, 1324};
int main()
{
    int t, record[10];
    char digtal[30];
    scanf("%d", &t);
    while(t --)
    {
        scanf("%s", digtal);
        memset( record, 0, sizeof( record));
        for(int i = 0; digtal[i] != '\0'; i ++)
            record[digtal[i] - '0'] ++;
        for(int i = 1; i <= 4; i ++) record[i] --;
        int sum = 0;
        for(int i = 9; i; i --)
            for(int j = 1; j <= record[i]; j ++)
                sum = (sum * 10 + i)%7;
        sum = (sum * 10000)%7;
        for(int i = 9; i >= 0; i --)
        {
            if(!i) printf("%d", p[sum]);
            for(int j = 1; j <= record[i]; j ++)
                printf("%d", i);
        }
        printf("\n");
    }
    return 0;
}
</span>

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值