设为首页 加入收藏

TOP

loj#6436. 「PKUSC2018」神仙的游戏(生成函数)(二)
2019-03-13 22:12:07 】 浏览:148
Tags:loj#6436. PKUSC2018 神仙 游戏 生成 函数
set(A, 0, sizeof(A)); memset(B, 0, sizeof(B)); } void Inv(int *a, int *b, int len) {//B1 = 2B - A1 * B^2 if(len == 1) {b[0] = fp(a[0], mod - 2); return ;} Inv(a, b, len >> 1); for(int i = 0; i < len; i++) A[i] = a[i], B[i] = b[i]; NTT(A, len << 1, 1); NTT(B, len << 1, 1); for(int i = 0; i < (len << 1); i++) mul2(A[i], mul(B[i], B[i])); NTT(A, len << 1, -1); for(int i = 0; i < len; i++) add2(b[i], add(b[i], -A[i])); for(int i = 0; i < (len << 1); i++) A[i] = B[i] = 0; } void Dao(int *a, int *b, int len) { for(int i = 1; i < len; i++) b[i - 1] = mul(i, a[i]); b[len - 1] = 0; } void Ji(int *a, int *b, int len) { for(int i = 1; i < len; i++) b[i] = mul(a[i - 1], fp(i, mod - 2)); b[0] = 0; } void Ln(int *a, int *b, int len) {//G(A) = \frac{A}{A'} qiudao zhihou jifen static int A[MAXN], B[MAXN]; Dao(a, A, len); Inv(a, B, len); NTT(A, len << 1, 1); NTT(B, len << 1, 1); for(int i = 0; i < (len << 1); i++) B[i] = mul(A[i], B[i]); NTT(B, len << 1, -1); Ji(B, b, len << 1); memset(A, 0, sizeof(A)); memset(B, 0, sizeof(B)); } void Exp(int *a, int *b, int len) {//F(x) = F_0 (1 - lnF_0 + A) but code ..why.... if(len == 1) return (void) (b[0] = 1); Exp(a, b, len >> 1); Ln(b, C, len); C[0] = add(a[0] + 1, -C[0]); for(int i = 1; i < len; i++) C[i] = add(a[i], -C[i]); NTT(C, len << 1, 1); NTT(b, len << 1, 1); for(int i = 0; i < (len << 1); i++) mul2(b[i], C[i]); NTT(b, len << 1, -1); for(int i = len; i < (len << 1); i++) C[i] = b[i] = 0; } void Sqrt(int *a, int *b, int len) { static int B[MAXN]; Ln(a, B, len); for(int i = 0; i < len; i++) B[i] = mul(B[i], INV2); Exp(B, b, len); } }; using namespace Poly; bool flag[MAXN]; signed main() { scanf("%s", s); N = strlen(s); int Lim = GetLen(N); Init(4 * Lim); for(int i = 0; i < N; i++) a[i] = (s[i] == '0'), b[i] = (s[N - i - 1] == '1'); Mul(a, b, Lim, Lim); LL ans = 1ll * N * N; for(int i = 1; i <= N; i++) { ans ^= 1ll * (N - i) * (N - i); for(int j = i; j < N; j += i) if(b[N - j - 1] || b[N + j - 1]) {ans ^= 1ll * (N - i) * (N - i); break;} } cout << ans; return 0; }
首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C++标准库笔记(一) 下一篇[usaco18Feb] New Barns

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目