HDU Just do it 找規律暴力

2021-08-06 07:09:01 字數 1554 閱讀 1439

just do it

簡單打一下表,我們會發現,在第 

m 次,第 

x項對第 

y 項的貢獻是 (y

−x+m

−1m−

1)由於是異或所以只與這個組合數是否為奇數有關,由lucus定理 這個數是奇數 ⇔(

y−x+

m−1a

ndm−

1)=1

為 了方便後面的計算,我們簡單的做乙個變換,考慮什麼時候 (y

−x) 對 

y 有貢獻,這樣我們只需要將等式中的

x換為 y−

x 這樣可以消去 

y 只不過這個複雜度的分析就不會了,當時始終感覺是 o(

n2)的,看了題解才知道原來題目的意思是,暴力上….

/*problem : 6129 ( just do it )     judge status : accepted

*runid : 21750455 language : g++ author : zouzhitao

*code render status : rendered by hdoj g++ code render version 0.01 beta

*/#include

#define pb push_back

#define mp make_pair

#define pi acos(-1)

#define fi first

#define se second

#define inf 0x3f3f3f3f

#define inf64 0x3f3f3f3f3f3f3f3f

#define random(a,b) ((a)+rand()%((b)-(a)+1))

#define ms(x,v) memset((x),(v),sizeof(x))

#define scint(x) scanf("%d",&x );

#define scf(x) scanf("%lf",&x );

#define eps 1e-10

#define dcmp(x) (fabs(x) < eps? 0:((x) <0?-1:1))

#define lc o<<1

#define rc o<<1|1

using

namespace

std;

typedef

long

long ll;

typedef

long

double db;

typedef pairpair;

const

int maxn = 2e5+10;

int a[maxn];

int b[maxn];

int main()

}std::cout

<< b[1];

for(int i=2 ; i<=n ; ++i)

std::cout

<< ' '

<< '\n';

}return

0;}

hdu Just do it 組合數規律

題意 求a陣列到b陣列的前i位異或m次的值,每次異或a陣列的值變為前i位異或後的值。比如 異或三次 第一次 b1 a1 b2 a1 a2 b3 a1 a2 a3 第二次 b1 a1 b2 a1 a1 a2 b3 a1 a1 a1 a2 a2 a3 第三次 b1 a1 b2 a1 a1 a1 a2 a...

找規律 遞推

總時間限制 1000ms 記憶體限制 1024kb 描述 火車從始發站 稱為第1站 開出,在始發站上車的人數為a,然後到達第2站,在第2站有人上 下車,但上 下車的人數相同,因此在第2站開出是 即在到達第3 站之前 車上的人數保持為a人。從第3站起 包括第3站 上 下車的人數有一定的規律 上車的人數...

模擬 找規律

現代數學的著名證明之一是georg cantor證明了有理數是可列舉的。他是用下面這一張表來證明這一命題的 1 1 1 2 1 3 1 4 1 5 2 1 2 2 2 3 2 4 3 1 3 2 3 3 4 1 4 2 5 1 我們以z字形給上表的每一項編號。第一項是1 1,然後是1 2,2 1,3...