【题意分析】

  求长度为n,元素大小在[1,m]∩N的序列中,有多少个序列中存在相同的相邻元素。

【解题思路】

  小学奥数题。。

  总序列数:S=mn

  不存在相同的相邻元素的序列数:T=m*(m-1)n-1(第一个元素有m种取法,剩下的每个元素都不能跟左边的元素相同,都有m-1种取法)

  故ans=S-T=mn-m*(m-1)n-1。复杂度O(log2n)。

【参考代码】

  我还不知道Py时写的代码。。

  1 #include<cmath>
  2 #include<cstdio>
  3 #include<cstdlib>
  4 #include<ctime>
  5 #define REP(I,start,end) for(int I=start;I<=end;I++)
  6 #define PER(I,start,end) for(int I=start;I>=end;I--)
  7 #define REPs(I,start,end,step) for(int I=start;I<=end;I+=step)
  8 #define PERs(I,start,end,step) for(int I=start;I>=end;I-=step)
  9 #define maxint 32767
 10 #define maxlongint 2147483647
 11 #define MOD 100003ll
 12 template<typename integer> inline bool even(integer n)
 13 {
 14     return ~n&1;
 15 }
 16 template<typename integer> inline integer exgcd(integer a,integer b,integer &x,integer &y)
 17 {
 18     if(!a&&!b)
 19         return -1;
 20     if(!b)
 21     {
 22         x=1;
 23         y=0;
 24         return a;
 25     }
 26     integer d=exgcd(b,a%b,y,x);
 27     y-=a/b*x;
 28     return d;
 29 }
 30 template<typename integer> inline integer fact(integer n)
 31 {
 32     integer result=integer(1);
 33     REP(i,1,n)
 34         result*=i;
 35     return result;
 36 }
 37 template<typename Float> inline bool fequals(Float A,Float B,Float eps=1e-9)
 38 {
 39     return fabs(A-B)<eps;
 40 }
 41 template<typename integer> inline integer gcd(integer A,integer B)
 42 {
 43     integer result=A;
 44     while(B)
 45     {
 46         A=B;
 47         B=result%B;
 48         result=A;
 49     }
 50     return result;
 51 }
 52 template<typename integer> inline integer sqr(integer n)
 53 {
 54     return n*n;
 55 }
 56 template<typename base_type,typename exp_type> inline base_type PowerMod(base_type Base,exp_type Exp,base_type Mod)
 57 {
 58     bool* sav=new bool[int(log(Exp)/log(2))+1];
 59     int tot=0;
 60     base_type result=base_type(1),baser=Base%Mod;
 61     exp_type tmp=Exp;
 62     while(tmp)
 63     {
 64         sav[tot++]=tmp&1;
 65         tmp>>=1;
 66     }
 67     while(tot)
 68     {
 69         result=sqr(result)%Mod;
 70         if(sav[--tot])
 71             result=result*baser%Mod;
 72     }
 73     delete []sav;
 74     return result;
 75 }
 76 template<typename input_type,typename return_type> inline return_type Lucas(input_type m,input_type n,return_type Mod)
 77 {
 78     return_type *_fact=new return_type[Mod+1],result=_fact[1]=return_type(1);
 79     REP(i,2,Mod)
 80         _fact[i]=_fact[i-1]*i%Mod;
 81     while(m&&n)
 82     {
 83         return_type _m=m%Mod,_n=n%Mod;
 84         if(_m<_n)
 85             return return_type(0);
 86         result=result*_fact[_m]*PowerMod(_fact[_n]*_fact[_m-_n]%Mod,Mod-2,Mod)%Mod;
 87         m/=Mod;
 88         n/=Mod;
 89     }
 90     delete []_fact;
 91     return result;
 92 }
 93 template<typename integer> inline bool Miller_Rabin(integer n,unsigned times)
 94 {
 95     if(n<4)
 96         return n>=0&&n<2;
 97     srand(unsigned(time(NULL)));
 98     int two=0;
 99     integer rest=n-1;
100     while(even(rest))
101     {
102         two++;
103         rest>>=1;
104     }
105     while(times--)
106     {
107         integer y=PowerMod(rand()%(n-3)+2,rest,n);
108         if(y==1||y==n-1)
109             return true;
110         int j=two;
111         while(j--)
112         {
113             y=sqr(y)%n;
114             if(y==1||y==n-1)
115                 break;
116         }
117         if(y!=n-1)
118             return false;
119     }
120     return true;
121 }
122 template<typename integer> inline integer mod_reverse(integer a,integer n)
123 {
124     integer x,y,d=exgcd(a,n,x,y);
125     if(d==1)
126         return NMod(x,n);
127     else
128         return -1;
129 }
130 template<typename int1,typename int2> inline int2 NMod(int1 A,int2 B)
131 {
132     return (A%B+B)%B;
133 }
134 template<typename integer> inline bool odd(integer n)
135 {
136     return n&1;
137 }
138 template<typename base_type,typename exp_type> inline base_type power(base_type Base,exp_type Exp)
139 {
140     bool* sav=new bool[log(Exp)/log(2)+1];
141     int tot=0;
142     base_type result=base_type(1);
143     exp_type tmp=Exp;
144     while(tmp)
145     {
146         sav[tot++]=tmp&1;
147         tmp>>=1;
148     }
149     while(tot)
150     {
151         result=sqr(result);
152         if(sav[--tot])
153             result=result*Base;
154     }
155     delete []sav;
156     return result;
157 }
158 template<typename integer> inline bool prime(integer n)
159 {
160     REP(i,2,sqrt(n))
161         if(n%i==0)
162             return false;
163     return true;
164 }
165 template<typename int1,typename int2> inline int1 ZnDiv(int1 A,int2 B)
166 {
167     return (A+B)/B-1;
168 }
169 template<typename int1,typename int2> inline int2 ZpMod(int1 A,int2 B)
170 {
171     return NMod(A-1,B)+1;
172 }
173 //===========================================Header Template==========================================
174 long long m,n;
175 int main()
176 {
177     scanf("%lld%lld",&m,&n);
178     m%=MOD;
179     printf("%lld\n",NMod(PowerMod(m,n,MOD)-PowerMod(m-1,n-1,MOD)*m%MOD,MOD));
180     return 0;
181 }
View Code

  。。再来看看Py。。

 1 AwD=100003
 2 
 3 def mpow(x,y):
 4     ret,bas,i=1,x%AwD,y
 5     while i:
 6         if i&1:
 7             ret=ret*bas%AwD
 8         bas=bas*bas%AwD
 9         i>>=1
10     return ret
11 
12 if __name__=="__main__":
13     argv=raw_input().split()
14     m,n=int(argv[0]),int(argv[1])
15     print (mpow(m,n)-m*mpow(m-1,n-1))%AwD
View Code

QAQ