【题意分析】
求长度为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 ",NMod(PowerMod(m,n,MOD)-PowerMod(m-1,n-1,MOD)*m%MOD,MOD)); 180 return 0; 181 }
。。再来看看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
QAQ