CF1925F/CF1924C Fractal Origami 题解

以下所有结论通过找规律获得,不会证明。

诈骗题。

发现每次 M M M V V V 增加量是相同的,且是上一次增加量的 2 \sqrt2 2 倍。

以下式子中 q q q 定义为 n − 1 n-1 n1

通过等比数列求和公式可以得到 M V = ( 2 ) q + 1 + ( 2 ) q − 2 − 1 ( 2 ) q + 1 + ( 2 ) q − 1 \frac{M}{V}=\frac{(\sqrt{2})^{q+1}+(\sqrt{2})^{q}-\sqrt{2}-1}{(\sqrt{2})^{q+1}+(\sqrt{2})^{q}-1} VM=(2 )q+1+(2 )q1(2 )q+1+(2 )q2 1

将上面式子写做 x 2 + y z 2 + w \frac{x \sqrt2+y}{z \sqrt2 +w} z2 +wx2 +y 的形式,其中 x , y , z , w x,y,z,w x,y,z,w 可以直接算出来,对 q q q 分奇偶讨论一下。

分母有理化,再把 2 \sqrt2 2 提出来,可以得到题目最后要求我们输出的就是 y z − x w 2 z 2 − w 2 \frac{yz-xw}{2z^2-w^2} 2z2w2yzxw,对分母那个玩意儿求一下逆元输出就可以了。

贴一下代码。

#include
using namespace std;
#define int long long
const int mod=999999893;
int t,n,x,y,z,w,B;
int KSM(int a,int b){
	int ans=1;
	while(b){
		if(b&1) ans=ans*a%mod;
		a=a*a%mod;
		b>>=1;
	}
	return ans;
}
signed main(){
	cin>>t;
	while(t--){
		cin>>n;
		n--;
		if(n%2==0) x=(KSM(2,n/2)-1+mod)%mod,y=(KSM(2,n/2)-1+mod)%mod;
		else x=(KSM(2,(n-1)/2)-1+mod)%mod,y=(KSM(2,(n+1)/2)-1+mod)%mod;
		z=(x+1)%mod,w=y;
		B=(y*z%mod-x*w%mod+mod)%mod*KSM((z*z%mod*2%mod-w*w%mod+mod)%mod,mod-2)%mod;
		cout<<B<<endl;
	}
	return 0;
}

你可能感兴趣的:(CF/ATC题解,算法)