Kodlås | 프로그래밍의 벗 PivotOJ
PivotOJ

Kodlås

시간 제한: 1000ms메모리 제한: 1024MB출처: Programmeringsolympiaden 2021 — skolkvalBOJ 21359

문제

Åskold har just köpt ett nytt kodlås. Försäljaren lovade att låset är mycket säkert, men Åskold är inte övertygad. Därför vill han att du ska räkna ut hur många olika kombinationer som öppnar låset.

Kodlåset består av NN intilliggande skivor. Varje skiva har MM segment, där ett segment antingen är ifyllt eller ett hål. För att skriva in en kod vrider man på skivorna. Varje skiva kan sättas i MM olika lägen, eftersom mekanismen inte tillåter att du vrider skivan mindre än ett helt segment. Låset öppnas om det någonstans går ett hål genom alla skivor på samma ställe.

Vi kan beskriva varje skiva som en sträng bestående av "." och "#", där "." representerar ett segment med hål i och "#" representerar ett ifyllt segment. Att rotera en skiva ett steg kan då ses som att ta sista tecknet i strängen och lägga det i början. Om skivan roteras MM steg kommer den tillbaka till läget den började i.

Exempelvis kan skivan ".#..#" ställas in i följande 5 lägen

.#..# #.#.. .#.#. ..#.# #..#.

Totalt finns det alltså MNM^N möjliga sätt att ställa in de NN skivorna, och låset öppnas ifall någon kolumn bara består av "." när man skriver ut alla skivornas strängar ovanför varandra. Skriv ett program som beräknar hur många sätt det finns att ställa in skivorna så att låset öppnas.

입력

Ditt program ska först läsa in två heltal: NN (1N121\le N \le 12)  -- antal skivor och MM (1M121\le M \le 12) -- antal segment.

Därefter ska ditt program läsa in beskrivningar av de NN skivorna. Varje skiva beskrivs av en rad med MM tecken bestående av "." och "#".

출력

Ditt program ska skriva ut ett heltal: antalet sätt man kan ställa in skivorna så att låset öppnas.

예제

예제 1

입력
2 3
.#.
#..
출력
9

예제 2

입력
3 4
..#.
####
..#.
출력
0

예제 3

입력
3 2
#.
.#
#.
출력
2

예제 4

입력
2 3
..#
.##
출력
6
코드를 제출하려면 로그인하세요.