https://vjudge.net/problem/48715/origin
题意:给出必定含1689四个数字的字符串,随意交换位置构造出能被7整除的数。
分析:数学思维题。观察发现1689的排列与7的余数恰好是0...6,那么利用这个性质去与串中其他数字相补出能被7整除的数,把1689固定在后四位,把0独自提取出来,其他数字为一组,把它们的数值*10000后mod7,根据得到的余数选择相应的1689排列,最后把0放在末尾(对结果正确性没有影响)。
代码:
#include <cstdio>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <queue> #define LL long long using namespace std; char s[];
char w[]; bool mark[]; int main()
{ memset(mark,false,sizeof(mark)); LL top = ,sum = ,i,Zero = ; cin>>s; int len = strlen(s); for(i = ;i < len; ++i)
{
if((s[i] == '' || s[i] == '' || s[i] == '' || s[i] == '') && mark[s[i]-''] == false)
{
mark[s[i]-''] = true;
}
else if(s[i] == '')
{
Zero ++;
}
else
{
w[top++] = s[i];
}
} for(i = ;i < top; ++i)
{
sum *= ;
sum += (w[i]-'');
sum %= ;
} sum *= ;
sum %= ; for(i = ;i < top; ++i)
{
printf("%c",w[i]);
} switch(sum)
{
case :printf("");break;
case :printf("");break;
case :printf("");break;
case :printf("");break;
case :printf("");break;
case :printf("");break;
case :printf("");break;
} while(Zero--)
{
printf("");
}
cout<<endl; return ;
}