置換開方 POJ3128

2021-07-03 13:22:08 字數 2148 閱讀 5916

題意:給乙個置換,判斷是否是另乙個置換的平方。

乙個置換可以表示成迴圈的乘積。對於長度為偶數的迴圈,它的平方會**成兩個長度各位之前一半的迴圈。對於長度為奇數的迴圈,它的平方不會**。所以對於當前置換中長度為偶數的迴圈,一定是以前的置換**出來的,判斷每個長度為偶數的迴圈的個數是否為偶數個即可。對於長度為奇數的迴圈,不用考慮。

**:

#include #include #include #include #include #include#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

#define pb push_back

#define mp make_pair

#define rep(i,x,n) for(int i=x;i<(n);++i)

#define for(i,l,h) for(int i=(l);i<=(h);++i)

#define ford(i,h,l) for(int i=(h);i>=(l);--i)

#define sz(x) ((int)(x).size())

#define all(x) (x).begin(), (x).end()

#define ri(x) scanf("%d", &(x))

#define rii(x, y) scanf("%d%d", &(x), &(y))

#define riii(x, y, z) scanf("%d%d%d", &(x), &(y), &(z))

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

#define drii(x, y) int x, y; scanf("%d%d", &x, &y)

#define driii(x, y, z) int x, y, z; scanf("%d%d%d", &x, &y, &z)

#define oi(x) printf("%d",x);

#define rs(x) scanf("%s", (x))

#define ms0(x) memset((x), 0, sizeof((x)))

#define ms1(x) memset((x), -1, sizeof((x)))

#define len(x) strlen(x)

#define f first

#define s second

#define swap(a, b) (a ^= b, b ^= a, a ^= b)

#define dpoint strcut node

#define cmpd int cmp(const int &a,const int &b)

/*#ifdef home

freopen("in.txt","r",stdin);

#endif*/

const int mod = 1e9+7;

typedef vectorvi;

typedef vectorvs;

typedef vectorvd;

typedef long long ll;

typedef pairpii;

//#define home

int scan()

/*----------------please-----do-----not-----hack-----me--------------------*/

char s[30];

int a[30];

int cnt[30];

int vis[30];

int main()

ms0(cnt);

ms0(vis);

rep(i,0,26)

}cnt[len]++;

}int ok=1;

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

}if(ok)

printf("yes\n");

else

printf("no\n");

} return 0;

}

poj 1012 約瑟夫置換

一開始用的不是約瑟夫置換 關鍵是要儲存之前求出的值。因為只有13個數,所以也可以另開程式手動求出所有k值塞進陣列,這樣每次查詢都是o 1 0ms了 首先m值必須在 k 1 2kn,2k n 1 n 0,1,2 之間,然後 列舉。include include include include incl...

poj 3270 Cow Sorting 置換問題

有n頭牛,沒頭牛都有自己的暴躁指數,並且互補相同,要把這些牛按暴躁指數從小到大排列,每次交換兩頭牛,消耗的體力為兩頭牛的暴躁指數和。應用的知識為置換。如把 1 2 3 4 5 6 變成 6 3 4 2 1 5 發現可以分成兩組來交換,第一組是 6 1 5 第二組為 2,3,4 只需交換組內的元素就可...

POJ2109 高精度(含大數開方) 二分

1 高精度 含大數開方 二分 乙個技巧和三點注意 技巧 假設k n p k的n次方 那麼p的位數 n得到的是k的位數!例如 n 7,p 4357186184021382204544,p的位數為22,用22 7的結果向上取整,得到4,即為k的位數,也就是說k的取值範圍是1000 9999。引自code...