Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 1735 | Accepted: 1085 |
Description
Input
Output
Sample Input
3 31 aaa 37 abc 29 hello*earth
Sample Output
1 0 0 0 1 0 8 13 9 13 4 27 18 10 12 24 15
题意:
表示最开始并没有看懂题目是什么意思,那一串字母代表f[i]的值
f(k) = ∑0<=i<=n-1aiki (mod p)转换成方程组便是,
a0*1^0 + a1*1^1+a2*1^2+........+an-1*1^(n-1) = f(1)
a0*2^0 + a1*2^1+a2*2^2+........+an-1*2^(n-1) = f(2)
......
a0*n^0 + a1*n^1+a2*n^2+........+an-1*n^(n-1) = f(n)
/* poj 2065 解对mod取模的方程组 */ #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <cmath> using namespace std; typedef long long ll; typedef long double ld; using namespace std; const int maxn = 105; int equ,var; int a[maxn][maxn]; int b[maxn][maxn]; int x[maxn]; int free_x[maxn]; int free_num; int n; void debug() { for(int i = 0; i < n; i++) { for(int j = 0; j <= n; j++) printf("%d ",a[i][j]); printf("\n"); } } int gcd(int a,int b) { while(b) { int tmp = b; b = a%b; a = tmp; } return a; } int lcm(int a,int b) { return a/gcd(a,b)*b; } int Gauss(int mod) { int max_r,col,k; free_num = 0; for(k = 0,col = 0; k < equ && col < var; k++,col++) { max_r = k; for(int i = k+1; i < equ; i++) { if(abs(a[i][col]) > abs(a[max_r][col])) max_r = i; } if(a[max_r][col] == 0) { k --; free_x[free_num++] = col; continue; } if(max_r != k) { for(int j = col; j < var+1; j++) swap(a[k][j],a[max_r][j]); } for(int i = k + 1; i < equ; i++) { if(a[i][col] != 0) { int LCM = lcm(abs(a[i][col]),abs(a[k][col])); int ta = LCM / abs(a[i][col]); int tb = LCM / abs(a[k][col]); if(a[i][col] * a[k][col] < 0) tb = -tb; for(int j = col; j < var+1; j++) { a[i][j] = ((a[i][j]*ta - a[k][j]*tb)%mod+mod)%mod; } } } } for(int i = k; i < equ; i++) if(a[i][col] != 0) return -1; if(k < var) return var-k; for(int i = var-1; i >= 0; i--) { ll temp = a[i][var]; for(int j = i +1; j < var; j++) temp =((temp- a[i][j]*x[j])%mod+mod)%mod; while(temp % a[i][i]) temp += mod; temp /= a[i][i]; temp %= mod; x[i] = temp; } return 0; } void ini() { memset(a,0,sizeof(a)); memset(x,0,sizeof(x)); equ = n; var = n; } char str[105]; int main() { int T,p; scanf("%d",&T); while(T--) { scanf("%d",&p); scanf("%s",str); n = strlen(str); ini(); for(int i=0; i<n; i++) { if(str[i]=='*') a[i][n]=0; else a[i][n]=str[i]-'a'+1; a[i][0]=1; for(int j=1; j<n; j++) a[i][j]=(a[i][j-1]*(i+1))%p; } //debug(); Gauss(p); for(int i = 0; i < n-1; i++) printf("%d ",x[i]); printf("%d\n",x[n-1]); } return 0; }