#include #define ll long long #define maxn 6000005 /*rem*/ #define mod 1000000007 #define db double #define vi vector #define pb push_back #define maxn 6000005 using namespace std; int dp[maxn], fl[maxn]; char inp[maxn]; int fr(int a) { return a >> 11; } int bk(int a) { return a & 2047; } int add(int a, int b) { a += b; return (a >= mod ? a - mod : a); } void work(int x, int y) { // y位往后可0可1 if (y == -1) { if (fl[x] == 0) dp[x] = 0; return; } work(x, y - 1); for (int i = x + (1 << y); i < x + (1 << (y + 1)); i++) dp[i] = add(dp[i], dp[i ^ (1 << y)]); work(x + (1 << y), y - 1); for (int i = x + (1 << y); i < x + (1 << (y + 1)); i++) dp[i] = add(dp[i], dp[i ^ (1 << y)]); } int main() { // i misunderstood the problem.. int test = 0; int t; if (!test) cin >> t; else t = 10; for (int i = 0; i < t; i++) { if (!test) { scanf("%s", inp); } else { for (int j = 0; j < (1 << 21) - 2; j++) inp[j] = '?'; } int l = strlen(inp); for (int i = 0; i <= l + 1; i++) fl[i] = 1, dp[i] = 0; dp[0] = 1; for (int i = 0; i < l; i++) if (inp[i] == '+') fl[i + 1] = 0; int qr = 0; while((1 << qr) - 1 < l + 1) qr++; work(0, qr); int ans = dp[l + 1]; if (ans & 1) ans += mod; ans /= 2; printf("%d %d\n", l + 1, ans); } return 0; } /* 1 ? */