1 条题解

  • 0
    @ 2026-5-10 12:15:06

    纯特判

    首先有一个结论:

    5K5K 之内除了 115K15K−1 都可以用 2a+3b2a+3b 这种形式凑出来,证明倒着来凑,发现是每 55 个一个循环就行了。


    MM 表示小红心,ii 表示其他位置的 131\sim3 倍区域。


    先考虑没有红心的情况:

    1. i
    2. i,i
    3. i,i,i
    

    前两个比较好判,最后那个由于 K>20K>20 ,如果 X<2KX<2K 显然是有解的,X>2KX>2K 的情况先搞一个 2K2K 出来,剩下的尝试用 2a+3b2a+3b3a+3b3a+3b 的形式凑就好了。


    然后是有红心的情况:

    M,i,i
    2M,i,i
    M,M,i
    2M,M,i
    2M,2M,i
    i,i,2M
    i,M,2M
    i,2M,2M
    M,M,2M
    M,2M,2M
    2M,2M,2M
    M,i
    M,2M
    i,2M
    2M
    

    这么直接讨论太麻烦了, 分成几类:

    第一类:454,5
    第二类:678156 ,7,8,15
    第三类:99
    第四类:10111710,11,17
    第五类:121314161712,13,14,16,17

    然后大力判就好了…


    代码如下:

    前面我觉得够详细,就没写注释
    #include <bits/stdc++.h>
    using namespace std;
    long long K,M,X,A[3],B[3],C[3],D[3];
    int T,ans;
    inline bool c1(register long long val){
    	if (val<=1 || val==5*K-1 || val>5*K)
            return false;
    	return true;
    }
    
    inline bool c2(register long long val){
    	if (val<=0 || val>2*K)
            return false;
    	return val%2==0;
    }
    
    inline bool c3(register long long val){
    	if (val<=0 || val>6*K)
            return false;
    	if (val>5*K)
            return val%3==0;
    	if (val%3==0)
            return true;
    	return val!=1 && val!=5*K-1;
    }
    inline bool c4(register long long val){
    	if (val<=0 || val>3*K)
            return false;
    	if (val%3==0)
            return true;
    	if (val<=2*K&&val%2==0)
            return true;
    	if (val<=K)
            return true;
    	return false;
    }
    inline bool mul(){
        return (X==2*M) || (X==3*M) || (X==4*M) || (X==5*M) || (X==6*M);
    }
    inline bool spj(){
    	if (X<=5*K&&X!=1&&X!=5*K-1)
            return true;
    	long long del=X-2*K;
    	if (del<=5*K&&del!=5*K-1)
            return true;
    	else{
    		while(del%3)
                del+=2;
    		if (del>6*K)
                return false;
    		return true;
    	}
    }
    int main(){
        ios::sync_with_stdio(0);
    	cin>>T;
    	cin>>A[0]>>B[0]>>C[0]>>D[0]>>K;
    	cin>>A[1]>>B[1]>>C[1]>>D[1]>>M);
    	cin>>A[2]>>B[2]>>C[2]>>D[2]>>X;
    	while(T--){
    		if (spj())
                ans++;
    		else if (c1(X-M) || c1(X-2*M))
                ans++;
    		else if (c2(X-M) || c2(X-2*M) || c2(X-3*M) || c2(X-4*M))
                ans++;
    		else if (c3(X-2*M))
                ans++;
    		else if (c4(X-2*M) || c4(X-3*M) || c4(X-4*M))
                ans++;
    		else if (mul()) 
                ans++;
    		K=(A[0]*K%D[0]*K%D[0]+B[0]*K%D[0]+C[0]) % D[0]+20;
    		M=(A[1]*M%D[1]*M%D[1]+B[1]*M%D[1]+C[1]) % D[1]+20;
    		X=(A[2]*X%D[2]*X%D[2]+B[2]*X%D[2]+C[2]) % D[2]+20;
    	}
    	cout<<ans;
        return 0;
    }
    
    本人写的第一篇题解,如有不对,希望谅解
    • 1

    信息

    ID
    4000
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者