程序无法通过测试用例

时间:2015-03-20 13:27:55

标签: c

Hacker Earth上有一个名为Dhoom 4的问题:

Samarpit是Dhoom 4的主要英雄。他正试图从黑客代码银行窃取。 Samarpit有一个印有整数值的键。他还有N个其他键,每个键都有自己的特定值。 Samarpit试图打破Lock,因为他应该获得锁定的关键价值。他可以执行一种操作。拿他自己的钥匙和其他N个钥匙之一并合并它们。在合并期间,Samarpit的Key值会更改为密钥模数100000的乘积。

例如,如果他的键值是X并且他拿了一个值为Y的键,那么他的新键将是(X*Y)%100000。在合并过程中使用的另一个键将与其他N-1一起使用密钥。

整个合并过程需要1秒钟。现在,由于他匆忙,他要求你找到他能达到锁定关键价值的最短时间。

输入:

第一行包含2个整数。它们是Samarpit的Key值和Lock的关键值。

第二行包含N,表示Samarpit具有的其他键的数量。

第三行包含N个以空格分隔的整数,表示N个其他键的值。

输出:

到达Lock's Key所需的最短时间。如果他无法达到该打印-1。

约束:

  • 1≤N≤1000
  • 1≤所有键的值≤100000

我的代码是:

#include <stdio.h>
#include <time.h>

void main()
{
    int i,f=0,n,skey,lkey,t=0;
    long int a[1000],prod;

    scanf("%d",&skey);
    scanf("%d",&lkey);
    prod=skey;
    scanf("%d",&n);
    if(n<=1000)
    {
        for(i=0;i<n;i++)
            scanf("%ld",&a[i]);

        if(skey==lkey)
            printf("0");
        else
        {
            for(i=0;i<n;i++)
            {
                if(a[i]<=100000L && lkey % a[i]==0)
                {
                    prod=(a[i]*prod)%100000L;
                    t++;

                    if(prod==lkey)
                    {
                        f=1;
                        printf("%d",t);
                        break;                  
                    }
                    else
                        f=0;
                }
            }
        }

    }
    if(f==0)
        printf("-1");

}

我的程序适用于较小的输入,但不适用于大型输入,如:

18023 15115
356
18121 1326 22175 6108 24870 5429 25714 8945 22404 19339 21602 31878 10196 `14252 7186 6020 15854 2140 6205 25226 32646 14294 6218 30002 21596 17190 18465 8855 32436 28884 27710 5396 22534 27330 9219 22350 17910 12119 9811 28276 31622 7645 11356 27077 23179 8744 32436 2899 2398 17273 22696 28167 4307 6818 5585 19686 5743 29546 24040 20370 1749 7474 17114 20 17538 11993 1311 19928 11962 16862 29256 16889 5314 26820 4568 18624 26960 25787 5205 13415 19008 24188 14495 23842 12424 9845 7040 608 23662 16422 9603 20813 20985 15563 2826 13468 31141 10555 4763 20869 14682 4880 5499 22025 6559 26888 28286 31869 19212 15019 19229 26694 8189 6958 4809 16354 20110 11160 22655 10280 3779 4131 2717 1232 26886 21733 21748 8757 18647 1455 26910 11354 10175 32054 8465 5931 25733 12144 12277 23558 6821 29505 21811 12410 3582 3927 17871 6735 32459 3667 16375 1222 31188 7721 31964 15137 30950 32457 29888 27750 26496 17407 10576 7265 24527 28311 27189 9704 13276 8390 18406 12899 5893 29125 10432 19083 31658 9407 13400 25713 31016 18157 2320 4802 19979 30976 28648 14666 21119 26559 663 27320 28424 14321 30683 21409 27507 27005 2573 22215 10765 30160 11256 16026 8978 11647 32747 10239 13416 6445 17677 2641 6541 25008 12017 165 8143 879 23402 14419 27323 20750 23201 10418 23767 2382 32100 30754 30868 1070 24001 12880 19838 15191 21972 13237 17846 12726 22749 28256 26530 32363 25237 27638 24547 32482 28867 12535 26503 29759 15114 25922 23168 4096 7429 26076 4693 13277 26262 9197 22808 26867 1658 29963 2200 21026 17185 14523 10711 7604 30141 30517 10431 14911 31642 23912 28688 21196 20909 14910 413 22072 3695 24865 24248 3547 11756 5566 21739 1896 25622 25865 745 22036 26976 3969 10691 28411 30088 26805 7775 9407 23732 20487 28455 1650 705 9904 4606 9654 6360 26372 11896 2082 22850 16631 22602 18408 13693 24545 19967 10165 10895 15742 4077 7641 12186 9785 25448 6824 29361 21162 5685 3616 22506 14941 5697 28876 28340 981 12691 21479 20843 13776 4736 15557 9002 3533 19486 20335 8161 8140 2811 3214 29351 9045` 

1 个答案:

答案 0 :(得分:0)

我很遗憾地说你的方法太简单了。 &#39;模数100000&#39;约束使得这个问题难以通过单个循环解决。

如果你用不仅仅是几个微不足道的数字测试你的算法,你会很快注意到这一点。随机选择任意两个4位数字并乘以它们; e.g。

1234 * 5678 = 7006652

显然,1234和5678是7006652的除数,但是1234和5678是不是 6652的除数。事实上,成功的键成为锁定除数的罕见巧合(当然,除非产品少于100000)。那么为什么以下代码行?

if (a[i]<=100000L && lkey % a[i]==0)

注意两个键的条件都失败了:

lkey % a[i] == 6652 % 1234 == 482 != 0
lkey % a[i] == 6652 % 5678 == 974 != 0

这两个密钥都不被接受(除了Samarpit持有的密钥;但不接受另一个密钥)。

在调试器中试用它,你会看到。这是输入文件:

1234 6652
1
5678

底线是,你的算法不适合解决这个问题;你将不得不采取完全不同的方法。

最直接的方法是生成所有可能的k-combinations个键,从 k = 1开始,然后增加直到找到匹配项。这可能不是最有效的方法,但它有效。以后担心优化。