1 1 … 1 ,那么对于每一位,( x i , y i ) (x_i,y_i) ( x i , y i ) 都有3 3 3 种取值,答案为3 n 3^n 3 n .(样例中27 27 2 7 的来源)如果有0 0 0 ,那么数对个数就没有这么多了,因为需要保证x , y ⩽ N x,y \leqslant N x , y ⩽ N .
例子先举个例子:N = 100 N=100 N = 1 0 0 :从高位开始,如果( x 0 , y 0 ) = ( 1 , 0 ) (x_0,y_0)=(1,0) ( x 0 , y 0 ) = ( 1 , 0 ) ,那么对于后面两位,x 1 , x 2 x_1,x_2 x 1 , x 2 只能取0 0 0 ,而y 1 , y 2 y_1,y_2 y 1 , y 2 则无限制.
为什么从高位开始?简单来说,比大小是从高位比的,如果x x x 最高位比N N N 小,那么x x x 一定比N N N 小,前一位将确定性地影响后面的选择.进一步联想到,比大小中这一位相同看下一位,应该 从高位开始逐位看 .
回到N = 100 N=100 N = 1 0 0 ,我们一位一位地看:
第一位是N 0 = 1 N_0=1 N 0 = 1 :有ans ( N 0 ) = 3 1 = 3 \operatorname{ans}(N_0)=3^1=3 a n s ( N 0 ) = 3 1 = 3 种取值; 再加上下一位,N 1 = 10 N_1=10 N 1 = 1 0 :第二位并不是总有3 3 3 种取值,应该比3 N 0 3N_0 3 N 0 少一些情形,具体地说,当( x 0 , y 0 ) = ( 1 , 0 ) (x_0,y_0)=(1,0) ( x 0 , y 0 ) = ( 1 , 0 ) 时,第二位不能取( 1 , 0 ) (1,0) ( 1 , 0 ) ,当( x 0 , y 0 ) = ( 0 , 1 ) (x_0,y_0)=(0,1) ( x 0 , y 0 ) = ( 0 , 1 ) 时,第二位不能取( 0 , 1 ) (0,1) ( 0 , 1 ) ,少了2 2 2 种,因此ans ( N 1 ) = 3 × 3 − 3 = 7 \operatorname{ans}(N_1)=3\times3-3=7 a n s ( N 1 ) = 3 × 3 − 3 = 7 种取值; 接着向下看,N 2 = 100 N_2=100 N 2 = 1 0 0 :它应该比3 N 1 3N_1 3 N 1 少一些情形,具体地说,当( x 01 , y 01 ) = ( 10 , 00 ) (x_{01},y_{01})=(10,00) ( x 0 1 , y 0 1 ) = ( 1 0 , 0 0 ) 时,第三位不能取( 1 , 0 ) (1,0) ( 1 , 0 ) ,当( x 01 , y 01 ) = ( 10 , 01 ) (x_{01},y_{01})=(10,01) ( x 0 1 , y 0 1 ) = ( 1 0 , 0 1 ) 时,第三位亦不能取( 1 , 0 ) (1,0) ( 1 , 0 ) ,少了2 2 2 种,当( x 01 , y 01 ) = ( 0 ? , 10 ) (x_{01},y_{01})=(0?,10) ( x 0 1 , y 0 1 ) = ( 0 ? , 1 0 ) 时,也少了2 2 2 种,共少了4 4 4 种,因此ans ( N 2 ) = 3 × 7 − 4 = 17 \operatorname{ans}(N_2)=3\times7-4=17 a n s ( N 2 ) = 3 × 7 − 4 = 1 7 种取值. 读者可以再写一些数感受一下,这里直接讨论一般情况了:
一般情况因为是一位一位地看的,设前i i i 位是N 0 ∼ i N_{0\sim i} N 0 ∼ i ,其答案为ans \text{ans} ans ,考虑下一位(第i + 1 i+1 i + 1 位).
如果下一位是1 1 1 ,显然3 3 3 种取值都能取到,结果是3 ans 3\text{ans} 3 ans .
如果下一位是0 0 0 ,减少的情形应该只有当x 0 ∼ i = N 0 ∼ i x_{0\sim i}=N_{0\sim i} x 0 ∼ i = N 0 ∼ i (或y 0 ∼ i = N 0 ∼ i y_{0\sim i}=N_{0\sim i} y 0 ∼ i = N 0 ∼ i ,先讨论x x x ),因为此时下一位被N N N 限制住了只能取0 0 0 ,情形会减少;否则如果x x x 的前i i i 位有一位与N N N 不同,下一位都是可以任意取的. 考虑x 0 ∼ i = N 0 ∼ i x_{0\sim i}=N_{0\sim i} x 0 ∼ i = N 0 ∼ i ,且x i + 1 = 1 x_{i+1}=1 x i + 1 = 1 时y y y 的可能取值,这是不合题意的,所以这时y y y 的可能取值数量就是不合题意的数量. 如果x 0 ∼ i x_{0\sim i} x 0 ∼ i 的某一位x j x_j x j 是1 1 1 那么y j y_j y j 只能取0 0 0 ,有一种取值,如果是0 0 0 那么y j y_j y j 可以取0 0 0 或1 1 1 ,有两种取值,如果前i i i 位有m m m 个0 0 0 ,依据乘法原理就有2 m 2^m 2 m 种取值,产生了2 m 2^m 2 m 种不合题意的情形,应当减去2 m 2^m 2 m .y 0 ∼ i = N 0 ∼ i y_{0\sim i}=N_{0\sim i} y 0 ∼ i = N 0 ∼ i 是同理的,所以说,结果应当减去2 × 2 m 2\times2^m 2 × 2 m ,是3 ans − 2 m + 1 3\text{ans}-2^{m+1} 3 ans − 2 m + 1 .
结论记ans ( N 0 ∼ i ) \operatorname{ans}(N_{0\sim i}) a n s ( N 0 ∼ i ) 表示将N N N 的前i i i 位作为N N N 对应的数对个数,m i m_i m i 表示N N N 的前i i i 位中0 0 0 的个数,有
ans ( N 0 ∼ i ) = { 3 , i = 0 3 ans ( N 0 ∼ i − 1 ) , i > 0 ∧ N i = 1 3 ans ( N 0 ∼ i − 1 ) − 2 m i , i > 0 ∧ N i = 0 \operatorname{ans}(N_{0\sim i})= \begin{cases} 3, & i=0 \\ 3\operatorname{ans}(N_{0\sim i-1}), & i>0 \land N_i=1 \\ 3\operatorname{ans}(N_{0\sim i-1})-2^{m_i}, & i>0 \land N_i=0 \\ \end{cases} a n s ( N 0 ∼ i ) = ⎩ ⎪ ⎪ ⎨ ⎪ ⎪ ⎧ 3 , 3 a n s ( N 0 ∼ i − 1 ) , 3 a n s ( N 0 ∼ i − 1 ) − 2 m i , i = 0 i > 0 ∧ N i = 1 i > 0 ∧ N i = 0
实现不难,这里就不详细解释了,直接放代码.
ACcode
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 #include <cstdio> #include <cstring> #define Code int main() { int T = 1; #define Codes int main() { int T=read(); #define by while (T--) eachT(); #define HTLDL return 0; #define HappyHDUPKSAI } inline long long read () { char st; long long x = 0 ; int fu = 1 ; st = getchar (); while (st > 57 || st < 48 ) { if (st == 45 ) fu = -1 ; st = getchar (); }while (st <= 57 && st >= 48 ) { x = (x << 3 ) + (x << 1 ) + st - 48 ; st = getchar (); }return x * fu; }typedef long long ll;const ll MOD = 998244353 ;char s[1234567 ];void eachT () { scanf ("%s" , s); int len = strlen (s); ll ans = 1 , pow = 1 ; for (int i = 0 ; i < len; ++i) { ans *= 3 ; if (s[i] == '0' ) { pow = (pow << 1 ) % MOD; ans -= pow; } ans = (ans + MOD) % MOD; } printf ("%lld" , ans); } Code by HTLDL HappyHDUPKSAI
时间复杂度Θ ( n ) \Theta(n) Θ ( n ) ,实测109ms \text{109ms} 109ms ,最优化可达到15ms \text{15ms} 15ms .
版權聲明: 本站所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 小明の雜貨鋪 !