首页 > 其他分享 >CF859G 题解

CF859G 题解

时间:2023-11-05 16:34:08浏览次数:32  
标签:frac gcd int 题解 CF859G theta prod omega

总结题意

显然可以转化为序列问题嘛。

给出序列 \(A\{a_i\}\),你需要通过若干次操作使其归零。

操作:

选定 \(d | n\)、\(k\)、\(r\),对于序列中所有满足 \(i \bmod d = r\) 的位置加上 \(k\)。

题解

很明显,加减相互抵消,对于所有 \(d\)、\(r\) 相同的位置可以视作一次操作。

如何表示一次操作呢?

如果你还记得生成函数这个高级东西的话,这就很容易了。

先把原序列函数化,记作:

\[A(x) = \sum_{i=0}^{n-1}a_ix^i \]

那么修改的增量多项式即为:

\[kf(d,r,x) \]

\[f(d,r,x) = x^r\frac{1 - x ^ n}{1 - x ^ d} \]

注意这里大于 \(n\) 的项可以不管他。

那么,有解当且仅当

\[\sum kf(d,r,x) = A(x) \]

有解。

丢番图方程的有解判断应用裴蜀定理,则有解条件:

\[\gcd\{f(d,r,x)\} | A(x) \]

谈论到这,我们发现

\[\frac{f(d,r,x)}{x^r} = f(d,0,x) \Rightarrow f(d,0,x) | f(d,r,x) \]

所以 \(f(d,r,x),r\not=0\) 是没有贡献的,不用考虑。

于是我们现在令

\[f(d,x) = \frac{1 - x ^ n}{1 - x ^ d} \]

有解:

\[\gcd\{f(d,x)\} | A(x) \]

现在这步不是拆 \(A\) 就是拆 \(f\),但 \(A\) 不是构造的,是输入的,所以我们讨论 \(f\)。

这里因式分解一下:

  • \(x^n - 1\) 在复数域上的因式分解

设其根为 \(re^{i\theta}\),

\[re^{i\theta} = 1 \]

\[(re^{i\theta})^n = 1 \]

\[r^ne^{in\theta} = 1 \times e^{i0} \]

\[r^n = 1,n\theta = 2 \pi k,k \in Z \]

\[r = 1,\theta = \frac{2k\pi}{n} \]

\[x = e^{i\frac{2k\pi}{n}} = \omega_n^{k} \]

显然,上式得证。

\[f(d,x) = \frac{\prod_{i=0}^{n-1} (x - \omega_n^i)}{\prod_{i=0}^{d-1} (x - \omega_d^i)} \]

\[= \frac{\prod_{i=0}^{n-1} (x - \omega_n^i)}{\prod_{i=0}^{d-1} (x - \omega_n^{\frac{ni}{d}})} \]

\[= \prod_{i=0}^{n-1}[\frac{n}{d} \not| i](x - \omega_n^i) \]

实际上,把 \(\frac{n}{d} \not| i\) 换个形式书写就是 \(gcd(i,n) = 1\),所以:

\[\gcd\{f(d,x)\} = \prod_{i=0}^{n-1}[gcd(i,n) = 1](x - \omega_n^i) \]

不太好做,容斥一下变成算补集,构造下补集:

\[\prod_{i=0}^{n-1}[gcd(i,n) = 1](x - \omega_n^i) = \frac{x^n - 1}{\prod_{i \in Primes,i | n}(x^{\frac{n}{i}} - 1)} \]

然后:

\[\frac{x^n - 1}{\prod_{i \in Primes,i | n}(x^{\frac{n}{i}} - 1)} | A(x) \]

\[x^n - 1 | A(x)\prod_{i \in Primes,i | n}(x^{\frac{n}{i}} - 1) \]

暴力循环卷积一下,算出右边。

没了。

code

#include <bits/stdc++.h>
#define int long long
using namespace std;
int n;
int a[100005], tmp[100005];
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> n;
    for (int i = 0; i < n; ++i) // A(x)
    {
        char ch;
        cin >> ch;
        a[i] = ch - '0';
    }
    int nn = n;
    for (int i = 2; i <= nn; ++i) //[(x^{n/p} - 1)]H(x)
    {
        if (nn % i == 0)
        {
            for(int j=0;j<n;j++)
            {
                tmp[(j + n/i) % n] = a[j] - a[(j + n/i) % n];
            }
            for(int j=0;j<n;j++)
            {
                a[j] = tmp[j];
            }
            while (nn % i == 0)
            {
                nn /= i;
            }
        }
    }
    for (int i = 0; i < n; ++i)
    {
        if (a[i] != 0)
        {
            cout << "NO\n";
            return 0;
        }
    }
    cout << "YES\n";
    return 0;
}

标签:frac,gcd,int,题解,CF859G,theta,prod,omega
From: https://www.cnblogs.com/2021cjx-akioi/p/17810669.html

相关文章

  • CF773A 题解
    真的是蓝题?这真的不是小学数学题?我们是要求满足(其中\(a\)为正确数,\(b\)为总数)\[\frac{x+a}{y+b}=\frac{p}{q}\]的最小\(b\)。我们可以先把右式的分子分母变化到与\(\frac{x}{y}\)类似的大小。intbs1=x/p+(x%p!=0);intbs2=y/q+(y%q!=0);i......
  • 【洛谷 P1909】[NOIP2016 普及组] 买铅笔 题解(打擂台法)
    [NOIP2016普及组]买铅笔题目背景NOIP2016普及组T1题目描述P老师需要去商店买支铅笔作为小朋友们参加NOIP的礼物。她发现商店一共有种包装的铅笔,不同包装内的铅笔数量有可能不同,价格也有可能不同。为了公平起见,P老师决定只买同一种包装的铅笔。商店不允许将铅笔的包装......
  • USACO铂金题解
    USACO铂金题解USACO2018PlatiumB.SortItOut很巧妙的转换注意到操作并不会影响没有被选中的牛的相对顺序所以没有被选中的一定单调递增要使得选中的尽可能少,就要选尽可能长的没有被选中的序列,即原序列的\(LIS\)所以原题等价于求原序列第\(k\)大\(LIS\)用树状数组......
  • [ARC140B] Shorten ARC 题解
    分析自然,我们可以想到利用贪心去解题。我们可以证明,$\texttt{ARC}$左右两边$\texttt{A}$和$\texttt{C}$个数多的比少的变为$\texttt{R}$贡献能更多,第奇数次操作比第偶数次能使操作次数更多。于是,我们可以得出这样的一个算法:若为奇数次操作那我们将现有的$\texttt{ARC......
  • 哈理工新生赛题解
    A小亮的睡眠时间思路:求一下一共花了多少时间思考,注意思考时间大于睡觉时间上限的特殊情况。#include<iostream>usingnamespacestd;intmain(){intn;scanf("%d",&n);intsum=0;intcur;inttotal=450;inth=0;ints=0;......
  • CF1089K King Kog's Reception 题解
    题目传送门前置知识线段树解法第一眼感觉和luoguP1083[NOIP2012提高组]借教室很像。本题同样采用线段树维护,\(sum_{l,r}(1\lel\ler\le10^6)\)表示从\(l\simr\)时刻内骑士拜访的总时间,\(maxx_{l,r}(1\lel\ler\le10^6)\)表示从\(l\simr\)时刻内骑士......
  • [ABC327G] Many Good Tuple Problems 题解
    题意对于一对长度均为\(M\)且元素值在\(\left[1,N\right]\)之间的序列\((S,T)\),定义其为好的当且仅当:存在一个长度为\(N\)的\(01\)序列\(X\),使得其满足如下条件:对于任意\(i\in\left[1,M\right]\),有\(X_{S_i}\neqX_{T_i}\)。给定\(N,M\),求在所有可......
  • CF1721A Image题解
    转裁自我的洛谷博客:https://www.luogu.com.cn/blog/653832/Code-of-CF1721A-Image题意简述给你一个2×2的矩阵,每次可以将一个或两个字母变成任意的其他字母,问最少用几步能将矩阵中的字母变成一样的。思路可以先分类讨论可能会出现的情况(如下表)。根据1,2,3列可得出暴力做法,即......
  • VM安装RedHat7虚机ens33网络不显示IP问题解决
    1、今天在VMware中安装RedHat7.4虚拟机,网络连接使用的是NAT连接方式,刚开始安装成功之后输入ifconfig还能看到ens33自动分配的IP地址,但是当虚机关机重启后,再查看IP发现原来的ens33网络已经没有了,只变成了这两个:然后输入ipa查看网卡信息发现出现了下面的信息:ens33:<BROADCA......
  • B3610 [图论与代数结构 801] 无向图的块 题解
    题目传送门前言本题解内容均摘自我的Tarjan学习笔记。解法Tarjan与无向图无向图与割点(割顶)在一个无向图中,不存在横叉边(因为边是双向的)。一个无向图中,可能不止存在一个割点。割点(割顶):在一个无向图中,若删除节点\(x\)以及所有与\(x\)相关联的边之后,图将会被分......