1095. Nikifor 3
Time limit: 1.0 second
Memory limit: 64 MB
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>