#P1078. pow

pow

題目描述

給定一個數 x 和 n 個數 a1...n 

求 xa1, xa2, ...,  xan 對 999999999999999989 取模的值

輸入格式

第一行兩個數 x, n

第二行有 n 個數 a1, ..., an 

輸出格式

輸出一行用空格分開的 n 個數: xa1, xa2, ...,  xan 

Samples

2 3
2 10 31
4 1024 2147483648

提示

1 <= x <= 109 

1 <= n <= 106 

1 <= ai <= 1012 (1 <= i <= n)

 

測試點  x <=   n <=   ai (1 <= i <= n) <= 
1101010
2109 10001000
3-5109 105 106 
6-10109 106 1012 

備註

#include <stdio.h> #include

#define int uint32_t #define ll uint64_t #define lll __uint128_t

char *p1, *p2, buf[100]; #define getchar() (p1p2&&(p2=(p1=buf)+fread(buf,1,100,stdin),p1p2)?EOF:p1++) inline ll read() {static ll x;static char c;x=0;c=getchar();while(c<'0'||'9'<c)c=getchar();while('0'<=c&&c<='9')x=x10+c-48,c=getchar();return x;} void write(ll x) {if(x>9)write(x/10);putchar('0'+x%10);}

const ll MOD = 999999999999999989; const int S = 1048576;

ll X; int N; lll A, B, C, M; ll a[S+1], b[S+1]; ll ans;

main() { X = read(), N = read(); A = read(), B = read(), C = read(), M = read();

a[0] = b[0] = 1;
for (register int i = 1; i <= S; i++) {
	 a[i] = ((lll)a[i - 1] * X) % MOD;
}
for (register int i = 1; i <= S; i++) {
	 b[i] = ((lll)b[i - 1] * a[S]) % MOD;
}

while (N--) {
	A = (A * B + C) % M;
	ans ^= (lll)a[A - (A >> 20 << 20)] * b[A >> 20] % MOD;
}

write(ans); putchar('\n');

return 0;

}

原始資料

  • Zero1 題號:b079
  • Hydro 題號:Z1079
  • Locale:zh_TW
  • Display:open