2010-1073

从 Trac 迁移的文章

这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。

原文章内容如下:

Contest 2 by CC98 1005 Strange Coding System解题报告[[BR]][[BR]]

题目大意:构造n进制下长度为l,且包含偶数个1的数串,问这样的数串有多少个,输出 (ans*2)mod 10[[BR]][[BR]]
方法:[[BR]]
      不难想到n进制下长为l的数串个数为 ans=C(n,0)*(n-1)^l^+C(n,2)*(n-1)^l-2^+C(n,4)*(n-1)^l-4^+...[[BR]][[BR]]

      考虑二项式定理:(x+y)^m^=C(m,0)*x^0^*y^m^ + C(m,1)*x^1^*y^(m-1)^ + ... + C(m,m)*x^m^*y^0^[[BR]]
      令x=n-1, y=1, m=l, n^l^=((n-1)+1)^l^=C(n,0)*(n-1)^l^+C(n,1)*(n-1)^l-1^+C(n,2)*(n-1)^l-2^+... -----式1[[BR]]
      令x=n-1, y=-1, m=l, (n-2)^l^=((n-1)-1)^l^=C(n,0)*(n-1)^l^-C(n,1)*(n-1)^l-1^+C(n,2)*(n-1)^l-2^+... -----式2[[BR]]
      式1+式2得 2*ans=n^l^+(n-2)^l^[[BR]]
      输出结果即为 求 (n^l^+(n-2)^l^)%10= n^l^%10 + (n-2)^l^%10[[BR]]
      据此,题目转化为快速求a^b^ mod m,采用快速幂取模求a的b次方余m算法即可解决该问题。
代码:[[BR]]
    {{{
#!cpp
#include<cstdio>
#define MODNUM 10
long exp_mod( long a, long b )
{                       
    long m = 1;
    while( b )
    {
        if( b & 1 )     m = ( ( a % MODNUM ) * ( m % MODNUM ) ) % MODNUM;
        b >>= 1;
        a = ( ( a % MODNUM ) * ( a % MODNUM ) ) % MODNUM;
    }
    return m;
}
int main()
{
    long n, m, ans;
    while( scanf("%ld%ld", &n, &m) != EOF )
    {
        ans = exp_mod(n,m)%10 + exp_mod(n-2,m)%10;
        printf("%ld\n", ans%10 );
    }
    return 0; 
}
}}}
[[BR]]-----------------------------------------------------------------------------------------[[BR]]

Contest 2 by CC98 1005 Strange Coding System解题报告

题目大意:构造n进制下长度为l,且包含偶数个1的数串,问这样的数串有多少个,输出 (ans*2)mod 10

方法:

不难想到n进制下长为l的数串个数为 ans=C(n,0)*(n-1)l+C(n,2)*(n-1)l-2+C(n,4)*(n-1)l-4+...

考虑二项式定理:(x+y)m=C(m,0)*x0*ym + C(m,1)*x1*y(m-1) + ... + C(m,m)*xm*y0

令x=n-1, y=1, m=l, nl=((n-1)+1)l=C(n,0)*(n-1)l+C(n,1)*(n-1)l-1+C(n,2)*(n-1)l-2+...


式1

令x=n-1, y=-1, m=l, (n-2)l=((n-1)-1)l=C(n,0)*(n-1)l-C(n,1)*(n-1)l-1+C(n,2)*(n-1)l-2+...


式2

式1+式2得 2*ans=nl+(n-2)l

输出结果即为 求 (nl+(n-2)l)%10= nl%10 + (n-2)l%10

据此,题目转化为快速求ab mod m,采用快速幂取模求a的b次方余m算法即可解决该问题。

代码:

{{{

#!cpp

#include

#define MODNUM 10

long exp_mod( long a, long b )

{

long m = 1;

while( b )

{

if( b & 1 ) m = ( ( a % MODNUM ) * ( m % MODNUM ) ) % MODNUM;

b >>= 1;

a = ( ( a % MODNUM ) * ( a % MODNUM ) ) % MODNUM;

}

return m;

}

int main()

{

long n, m, ans;

while( scanf("%ld%ld", &n, &m) != EOF )

{

ans = exp_mod(n,m)%10 + exp_mod(n-2,m)%10;

printf("%ld\n", ans%10 );

}

return 0;

}

}}}