【POJ】2065 SETI

题意:直接拿样例,37 abc。

a~z表示1~26,*表示0。

x0*1^0+x1*1^1+x2*1^2=1(mod 37)

x0*2^0+x1*2^1+x2*2^2=2(mod 37)

x0*3^0+x1*3^1+x2*3^2=3(mod 37)

高斯消元,除法x等于乘以x对p的逆元。

 1 #include<cstdio>

 2 #include<cstring>

 3 #include<algorithm>

 4 #define MAXN 110

 5 using namespace std;

 6 char str[MAXN];

 7 int n, p;

 8 int g[MAXN][MAXN], x[MAXN];

 9 int GET(char ch) {

10     if (ch == '*')

11         return 0;

12     return ch - 'a' + 1;

13 }

14 int PowMod(int a, int b, int c) {

15     int res;

16     for (res = 1; b; b >>= 1) {

17         if (b & 1) {

18             res *= a;

19             res %= c;

20         }

21         a *= a;

22         a %= c;

23     }

24     return res;

25 }

26 int EXTGCD(int a, int b, int &x, int &y) {

27     int t, d;

28     if (b == 0) {

29         x = 1;

30         y = 0;

31         return a;

32     }

33     d = EXTGCD(b, a % b, x, y);

34     t = x;

35     x = y;

36     y = t - a / b * y;

37     return d;

38 }

39 int Invmod(int a, int n) {

40     int x, y;

41     EXTGCD(a, n, x, y);

42     return (x % n + n) % n;

43 }

44 void Gauss() {

45     int i, j, k, tmp;

46     for (i = 0; i < n; i++) {

47         for (j = i; j < n; j++) {

48             if (g[j][i])

49                 break;

50         }

51         if (j != i) {

52             for (k = i; k <= n; k++)

53                 swap(g[j][k], g[i][k]);

54         }

55         for (j = i + 1; j < n; j++) {

56             if (g[j][i]) {

57                 tmp = (g[j][i] * Invmod(g[i][i], p)) % p;

58                 for (k = i; k <= n; k++) {

59                     g[j][k] -= tmp * g[i][k];

60                     g[j][k] = (g[j][k] % p + p) % p;

61                 }

62             }

63         }

64     }

65     for (i = n - 1; i >= 0; i--) {

66         tmp = 0;

67         for (j = i + 1; j < n; j++) {

68             tmp += x[j] * g[i][j];

69             tmp = (tmp % p + p) % p;

70         }

71         tmp = g[i][n] - tmp;

72         tmp = (tmp % p + p) % p;

73         x[i] = tmp * Invmod(g[i][i], p) % p;

74     }

75 }

76 int main() {

77     int c;

78     int i, j;

79     scanf("%d", &c);

80     while (c--) {

81         scanf("%d %s", &p, str);

82         n = strlen(str);

83         for (i = 0; i < n; i++) {

84             g[i][n] = GET(str[i]);

85             for (j = 0; j < n; j++)

86                 g[i][j] = PowMod(i + 1, j, p);

87         }

88         Gauss();

89         printf("%d", x[0]);

90         for (i = 1; i < n; i++)

91             printf(" %d", x[i]);

92         putchar('\n');

93     }

94     return 0;

95 }

你可能感兴趣的:(set)