1 条题解
-
0
纯特判
首先有一个结论:
在 之内除了 和 都可以用 这种形式凑出来,证明倒着来凑,发现是每 个一个循环就行了。
设 表示小红心, 表示其他位置的 倍区域。
先考虑没有红心的情况:
1. i 2. i,i 3. i,i,i前两个比较好判,最后那个由于 ,如果 显然是有解的, 的情况先搞一个 出来,剩下的尝试用 或 的形式凑就好了。
然后是有红心的情况:
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这么直接讨论太麻烦了, 分成几类:
第一类:
第二类:
第三类:
第四类:
第五类:然后大力判就好了…
代码如下:
前面我觉得够详细,就没写注释
#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
- 上传者