[JSOI2012]分零食,洛谷P5075,有趣的公式推导和多项式求逆

正题

      题目链接点这里

      考虑一个m次多项式Q[x]=Ox^2+Sx+UQ[0]=0

      当只有一个人的时候,贡献恰好是Q[m]

      当有两个人的时候,贡献恰好是Q^2[m]

      因为第m项是由(0,m),(1,m-1),...,(m-1,1),(m,0)转移过来的,因为我们已经规定了Q[0]=0

      所以Q^2[m]恰好是两个人的贡献,以此类推。

      答案就等于\sum_{k=1}^{A} Q^k[m]

      发现是等比数列求和,在前面补上一个1,就等于(\frac{Q^{A+1}}{Q-1}-1)[m]

      小括号指的是一个多项式。

      那么Q-1直接多项式求逆就可以了,因为明显-1的逆元就是-1,所以跟P是否为质数没有关系。

      Q^{A+1}直接快速幂加FFT就可以了。

      因为m不为0,所以减不减1其实没有意义。

 

#include
#include
#include
#include
#include
using namespace std;

const int maxn=1e4,maxm=maxn*4+10;
struct complex{
	double x,y;
	complex operator+(const complex a)const{return (complex){x+a.x,y+a.y};}
	complex operator-(const complex a)const{return (complex){x-a.x,y-a.y};}
	complex operator*(const complex a)const{return (complex){x*a.x-y*a.y,x*a.y+y*a.x};}
}x[maxm],y[maxm];
int n,mod,t,a,b,c;
int last[maxn+10],temp[maxn+10],tot[maxn+10],op[maxn+10];
int limit,l;
int where[maxm];
const double Pi=acos(-1.0)*2.0;

void dft(complex *now,int idft){
	for(int i=0;i>1]>>1)|((i&1)<<(l-1))),x[i]=y[i]=(complex){0,0};
	for(int i=0;i

在洛谷暂时排第四。

你可能感兴趣的:([JSOI2012]分零食,洛谷P5075,有趣的公式推导和多项式求逆)