回复:烂代码,见笑了。

来源: danana 2009-05-12 13:27:25 [] [旧帖] [给我悄悄话] 本文已被阅读: 次 (1742 bytes)
回答: 回复:南斯拉夫奥赛题:2009(3星)danana2009-05-12 12:46:16


#include

#define NDIGIT 224

int rem[256]; /* stores (10^n % 2009) */
int goal;

int dig[7], cut[7]; /* backtrack states */
int cur_rem, cur_dig; /* for convenience */

int backtrack(int step)
{
int ii, jj; /* ii is current digit, 9-jj is the value for it */

/* goal reached */
if (cur_rem == goal && cur_dig == 0)
{
for (ii = 0; ii < step; ii++)
printf("%d %d\n", dig[ii], 9-cut[ii]);
return 1;
}
if (step == 7) return 0;

for (ii = step ? dig[step - 1] - 1 : NDIGIT; ii > 0; ii--)
{
for (jj = cur_dig; jj > 0; jj--)
{
dig[step] = ii;
cut[step] = jj;
cur_rem = (cur_rem + rem[ii - 1] * jj) % 2009;
cur_dig -= jj;

if (backtrack(step + 1)) return 1;

cur_rem = (cur_rem - rem[ii - 1] * jj) % 2009;
cur_dig += jj;
}
}
return 0;
}

int main()
{
int ii;

/* initialize rem, rem[i] = (10 ^ i) % 2009 */
for (rem[0] = 1, ii = 1; ii < NDIGIT; ii++)
rem[ii] = (rem[ii - 1] * 10) % 2009;

/* now get the remainder of 999999.... (224 9's) % 2009 */
for (goal = 0, ii = 0; ii < NDIGIT; ii++)
goal = (goal + rem[ii] * 9) % 2009;

/* now backtrack to match goal by removing a total
* of (224 * 9 - 2009) = 7 from all digits */
cur_rem = 0;
cur_dig = 7;
return !backtrack(0);
}
请您先登陆,再发跟帖!

发现Adblock插件

如要继续浏览
请支持本站 请务必在本站关闭/移除任何Adblock

关闭Adblock后 请点击

请参考如何关闭Adblock/Adblock plus

安装Adblock plus用户请点击浏览器图标
选择“Disable on www.wenxuecity.com”

安装Adblock用户请点击图标
选择“don't run on pages on this domain”