查看: 1586|回復: 2
打印 上一主題 下一主題

[ZJ] a568 - ISSC 2012- problem B

[複製鏈接]
  • TA的每日心情
    慵懶
    2015-4-10 14:18
  • 簽到天數: 78 天

    [LV.6]常住居民II

    176

    主題

    612

    帖子

    3959

    積分

    管理員

    Rank: 9Rank: 9Rank: 9

    積分
    3959

    台南一中資訊社新手達陣程式設計達人 - 2014

    跳轉到指定樓層
    樓主
    發表於 2014-6-26 17:21:22 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

    趕快加入我們來參與討論吧!

    您需要 登錄 才可以下載或查看,沒有帳號?加入我們

    x
    原題:http://zerojudge.tw/ShowProblem?problemid=a568
    AC:http://zerojudge.tw/Submissions?problemid=a568&account=lfs92002
    解題方法:數學解

    考慮兩個N位數[tex]A,B[/tex],則可把要求的數字P表示成[tex]A%20%5Ctimes%2010%5E%7BN+1%7D+B[/tex],求取使P整除A,B的所有P之個數。

    [tex]Follow%20Steps%3A%5C%5C%20G%3DA%5Ctimes%2010%5EN+B%5C%5C%20%5C%5C%20G%5C%25%20A%3D0%5Crightarrow%20B%5C%25A%3D0%5Crightarrow%20B%3DkA%281%5Cleq%20k%3C10%29%5C%5C%20%5C%5C%20G%5C%25%20B%3D0%5Crightarrow%20A%5Ctimes%2010%5EN%5C%25B%3D0%5C%5C%20%5Crightarrow%20A%5Ctimes%2010%5EN%5C%25%28kA%29%3D10%5EN%5C%25k%3D0%5C%5C%20%5C%5C%20%5Ctherefore%20k%3D1%2C2%2C5%2C4%28N%5Cgeq%202%29%2C8%28N%5Cgeq%203%29[/tex]

    可得B必為A的1,2,4,5,8倍,那只要把[tex]10^N/k-10^{N-1}[/tex]都加起來即可,看起來很麻煩的模運算除法可以由提出10的次方先約掉,變成乘法運算後再取模,即可輕鬆求解。


    /**********************************************************************************/
    /*  Problem: a568 "ISSC 2012- problem B" from ISSC 2012                           */
    /*  Language: CPP (549 Bytes)                                                     */
    /*  Result: AC(1.8s, 256KB) judge by this@ZeroJudge                               */
    /*  Author: lfs92002 at 2014-06-26 17:18:54                                       */
    /**********************************************************************************/


    #include<cstdio>
    using namespace std;

    int mpow(int a,int e,int m)
    {
        if(e==0)return 1;
        int p=mpow(a*a%m,e/2,m);
        if(e%2==0)return p;
        return p*a%m;
    }

    int main()
    {
        const int ansOfNe1=14;
        int N,M;
        while(~scanf("%d%d",&N,&M))
        {
            int En=mpow(10,N-1,M);
            int sum=0;
            //K=1
            sum=(10*En-En)%M;
            //K=2
            sum+=(5*En-En)%M;
            //K=5
            sum+=(2*En-En)%M;
            //K=4 for N>=2
            if(N>=2)
            sum+=(25*mpow(10,N-2,M)-En+25*M)%M;
            //K=8 for N>=3
            if(N>=3)
            sum+=(125*mpow(10,N-3,M)-En+125*M)%M;
            printf("%d\n",sum%M);
        }
    }



    點評

    %D是多餘的 已修正XD  發表於 2014-6-28 13:54
    有點不解.... 那個D是什麼啊OAO??  發表於 2014-6-27 19:26
    回復

    使用道具 檢舉

    您需要登錄後才可以回帖 登入 | 加入我們

    本版積分規則

    快速回覆 返回頂部 返回列表