首页 > 其他分享 >Topcoder 10880 - Functional Equation

Topcoder 10880 - Functional Equation

时间:2023-04-16 20:00:35浏览次数:35  
标签:lfloor cur mC dfrac Equation rfloor 10880 2C Topcoder

首先分析一下这个鬼畜的函数,我们考虑

\(f(x)+2C\)

\(=f(2f(x)-x+1)+C\)

\(=f(2f(2f(x)-x+1)-(2f(x)-x+1)+1)\)

\(=f(2(f(x)+C)-2f(x)+x-1+1)\)

\(=f(x+2C)\)

也就是 \(f(x)=f(x\bmod 2C)+2C\lfloor \dfrac{x}{2C}\rfloor\)

也就是,只要决定了 \(f(x)\),\(f(x+2mC)\) 也就被确定了。

但是剩下的就没有关系了吗?

设 \(a\) 是偶数,\(a=2a'\)

那么设 \(b'=(f(a)-a')\bmod C\)

也就是 \(f(a)=a'+b'+mC\)

那么对于 \(b=2b'+1\)

\(f(2f(a)-a+1)=f(a)+C\)

\(f(2a'+2b'-a+2mC+1)=a'+b'+mC+C\)

\(f(b)+2mC=a'+b'+mC+C\)

\(f(b)=a'+b'-mC+C\)

所以,一旦我们决定了 \(a\) 其实也就相对应的决定了 \(b\)。同时,如果我们决定 \(b\),那么也可以从 \(b\) 反推出 \(a\),也就是我们其实是将 \(a\) 和 \(b\) 配对了。

那么,如果我们将 \(a\) 和 \(b\) 配对,\(f(a)\) 和 \(f(b)\) 其实都变成了 \(m\) 的函数。而对于其他的值,它们之间的取值是互不相干的。

然后,我们对于所有 \(x_i\bmod 2C=a\),

\(|f(x_i)-y_i|\)

\(=|f(a)+2C\lfloor \dfrac{x_i}{2C}\rfloor-y_i|\)

\(=|a'+b'+mC+2C\lfloor \dfrac{x_i}{2C}\rfloor-y_i|\)

\(m\) 对这个类的答案的贡献其实就是 \(mC\) 到 \(y_i-a'-b'-2C\lfloor \dfrac{x_i}{2C}\rfloor\) 的距离。

对于所有 \(x_i\bmod 2C=b\),

\(|f(x_i)-y_i|\)

\(=|f(b)+2C\lfloor \dfrac{x_i}{2C}\rfloor-y_i|\)

\(=|a'+b'-mC+C+2C\lfloor \dfrac{x_i}{2C}\rfloor-y_i|\)

\(=|mC-a'-b'-C-2C\lfloor \dfrac{x_i}{2C}\rfloor+y_i|\)

\(m\) 对这个类的贡献就是 \(mC\) 到 \(a'+b'+C+2C\lfloor \dfrac{x_i}{2C}\rfloor-y_i\) 的距离。

那么,我们就可以把这些数依次排开,然后我们就希望 \(mC\) 能取到这些数的中位数。可惜有时取不到,那就把最靠近中位数的两个都拿出来试试,得到 \(a\) 和 \(b\) 配对情况下 \(a\) \(b\) 两类的最小贡献。

然后就是二分图最小权最大匹配,因为 \(C\) 是 \(16\),所以用状压 \(dp\)、费用流、\(\text{KM}\) 等各种算法碾过去就可以了。

struct FunctionalEquation{
	int x[10005],y[10005];ll e[16][16];
	ll dp[1<<17];
	ll minAbsSum(int c,int n,int xzero,int xprod,int xadd,int xmod,int yzero,int yprod,int yadd,int ymod){
		x[0]=xzero,y[0]=yzero;
		rep(i,1,n-1)x[i]=(1ll*x[i-1]*xprod+xadd)%xmod;
		rep(i,1,n-1)y[i]=(1ll*y[i-1]*yprod+yadd)%ymod;
		vt<int>v[32];
		rep(i,0,n-1){
			y[i]-=2*c*(x[i]/(2*c));
			x[i]=x[i]%(2*c);
			v[x[i]].pb(y[i]);
		}
		rd(i,2*c)sort(v[i].begin(),v[i].end());
		for(int a=0;a<c;a++)for(int b=0;b<c;b++){
			vt<int>cur;
			for(auto i:v[2*a]){
				cur.pb(i-a-b);
			}
			for(auto i:v[2*b+1]){
				cur.pb(a+b+c-i);
			}
			sort(cur.begin(),cur.end());
			int m=cur.size();
			if(m==0){
				e[a][b]=0;
				continue;
			}
			m=(m-1)/2;
			ll sum1=0,sum2=0,n1=floor(1.0*cur[m]/c),n2=n1+1;
			for(auto i:cur)sum1+=abs(n1*c-i);
			for(auto i:cur)sum2+=abs(n2*c-i);
			e[a][b]=min(sum1,sum2);
		}
		rd(i,(1<<c))dp[i]=1e18;
		dp[0]=0;
		rep(msk,0,(1<<c)-1){
			int x=__builtin_popcount(msk);
			rd(y,c)if(!(msk>>y&1)){
				dp[msk|(1<<y)]=min(dp[msk|(1<<y)],dp[msk]+e[x][y]);
			}
		}
		return dp[(1<<c)-1];
	}
};

标签:lfloor,cur,mC,dfrac,Equation,rfloor,10880,2C,Topcoder
From: https://www.cnblogs.com/jucason-xu/p/17323922.html

相关文章

  • AtCoder Regular Contest 158 D - Equation
    题目链接原本看着式子直接晕了,觉得是高深的硬核数论,于是放弃(然后E也没想出来,sad)关键的思路在于,考虑构造由(a,b,c)->(ta,tb,tc)这样的求解方式。在看到这个做法后,会发现它很好地利用了题目齐次的性质;至于如何由齐次式想到这个做法,可能需要足够的天赋或者经验吧(悲)化简后得到\(At......
  • MATH1851 Ordinary differential equations
    课程内容笔记,自用,不涉及任何assignment,exam答案Notesforself-use,donotincludeanyassignmentsorexamsMATH1851的第二节:主要学习常微分方程ODE:Ordinary......
  • 「解题报告」ARC158D Equation
    好神仙的题。考虑形如\(F(x,y,z)=x^i+y^i+z^i\)的函数有一个性质:\(F(tx,ty,tz)=t^iF(x,y,z)\)。原式要求\((x+y+z)(x^n+y^n+z^n)(x^{2n}+y^{2n}+z^{2n......
  • HDU2199 Can you solve this equation? (二分查找)
    Canyousolvethisequation?TimeLimit:2000/1000MS(Java/Others)    MemoryLimit:32768/32768K(Java/Others)TotalSubmission(s):12794    AcceptedS......
  • 题解 Topcoder SRM789 FollowingNim
    题目链接题意给定\(n\)堆石子\(a_1,a_2,\cdots,a_n\)和一个集合\(S\),两名玩家轮流行动,每次可以在某堆石子中取走\(x\)个(不能不取)。特殊地,如果\(x\inS\),那么下......
  • MATH1851 Calculus and ordinary differential equations
    课程内容笔记,自用,不涉及任何assignment,exam答案Notesforselfuse,notincludedanyassignmentsorexams由于提前预习了微积分(见微积分\(I\),微积分\(II\))......
  • Functions, Equations and Polynomials (Pure Math)
    MO题乱做\(f:\mathbb{N}^*\mapsto\mathbb{N}^*,\foralln\in\mathbb{N}^*,f(f(n))<f(n+1)\).求\(f(n)\).有一个很厉害的做法.首先我们证明\(f(1)\)是\(\{f(k)|......
  • The Human Equation
    TheHumanEquation关键赛后随便猜了一下,竟然过了。只能说当时还是太急了,毕竟对E多少有点害怕。不行,以后要到能出E的水平代码#include<bits/stdc++.h>usingnamespa......
  • HDU 6439 2018CCPC网络赛 Congruence equationI(杜教筛 + 莫比乌斯反演 + 伯努利数)
      大致题意:给你一个长度为k的序列a。对于序列c,当  时,;当时,取[0,m)中任意一个数字。令  表示满足  的序列c的方案数。现在让你求 。          ......
  • differential equations in linear algebra
    differentialequationsinlinearalgebra标签(空格分隔):线性代数目录differentialequationsinlinearalgebra1.Idea2.differentialeqautionsinalgebra3.firstord......