1 条题解
-
0
自动搬运
来自洛谷,原作者为

QuantAsk
烟火里成灰,也去的完美。搬运于
2025-08-24 22:24:39,当前版本为作者最后更新于2020-10-20 07:22:53,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
出题人先来报个到,比赛的时候发现许多选手的做法都和我的不一样/kk。也有莫比乌斯反演过了的神仙。也十分感谢本题的验题人 beginend 和 my_dog。
T4 象棋与马
这个马能走到全图的充要条件显然是它能走到 。考虑给出 求它能否走到 。
算法1:
暴力 bfs 看是否能到达 或打表。
期望得分 。
算法2:
请注意下文中 表示当前马的坐标, 表示马一步走的矩形的长和宽。
考虑从数论角度考虑本题。
首先如果当 显然不行。
因为走的顺序时无所谓的,所以可以将走的路程分成两段,一段只有是 的位移,一段是只有 的位移。
显然对于第一段能走到的点可以表示为 或 。第二段同理为 或 。其中 。那么我们可以推出公式有
$$\left\{\begin{matrix} 2ax=2by \\ 2cy=2dx+1 \end{matrix}\right. $$$$\left\{\begin{matrix} 2ax+x=2by \\ 2cy+y=2dx+1 \end{matrix}\right. $$$$\left\{\begin{matrix} 2ax=2by+y \\ 2cy=2dx+x+1 \end{matrix}\right. $$$$\left\{\begin{matrix} 2ax+x=2by+y \\ 2cy+y=2dx+x+1 \end{matrix}\right. $$设 是任意整数。
解第一个方程组得到 且 。因为 互质,所以 和 都可以表示成任意整数。所有就有 且 ,显然无解。
同理第二个方程组可以推出 且 ,就是 是偶数, 是奇数。
第三个方程组推出 且 ,就是 是奇数, 是偶数。
第四个方程组推出 且 ,显然无解。
所以 当且仅当 且 是一个奇数。
然后暴力求出所有的 即可,期望得分 。
算法3:
如果 是一个奇数那么 也是一个奇数,所以 且 是一个奇数也是 的充要条件。
定义 表示 中有多少个奇数与 互质,考虑如何计算 。
显然如果 是一个偶数,那么没有偶数与它互质,即 ,我们不难发现 。
如果 是一个奇数,对于一个奇数 ,有 那么就有 也就是对于每个奇数与它互质那么一定有一个对应的偶数 与它互质,也就是 ,当然对于 需要进行特判。
那么显然线性求 就可以获得 。
算法4:
显然答案就是奇数的 加上偶数的 除以 。所以我们需要分开计算奇数和偶数的
若 是一个偶数,假设我们已经求出了 ( 是奇数)和 ( 是偶数)那么考虑如何求到 。首先我们有 ( 是偶数)。(对于每个奇数乘上一个 ,根据 的定义我们发现它多了一个 这个因子,而 乘上了一个 ,所以 不变;而对于一个偶数乘上了一个 ,没有加减因子,但是 乘上了一个 ,所以它的 也要乘 )。
然后用杜教筛求出 然后减去前面求出的答案就是奇数的答案了。时间复杂度 ,预处理到 的答案即可大大缩小时间复杂度。
期望得分。
算法5:
其实最终式子可以优化为递推式
$$ans(n)=ans(\lfloor \frac{n}{2}\rfloor)+\sum_{i=1}^n\varphi(i) $$看到最终许多通过的选手都是写成这种形式的
对于的部分分是给莫比乌斯反演的,没想到有人能优化到可以通过的形式。对于自然溢出需要注意的地方,就是在杜教筛中 时需要注意让偶数的那个先除以否则会溢出之后再除上一个 就会出现 的情况。
然后还有人写到 的部分分是我没有预料到的(因为我都不会写,果然选手的智慧是无限的)。
#include<cstdio> #include<cstring> #include<algorithm> #include<map> #define ll unsigned long long using namespace std; const ll N=1e7+1; ll T,n,cnt,mu[N],phi[N],pri[N]; ll sp1[N],sp2[N],p1[1100],p2[1100]; bool vis[N]; map<ll,ll> sp,sm; void prime(){ phi[1]=1; for(ll i=2;i<N;i++){ if(!vis[i])pri[++cnt]=i,phi[i]=i-1; for(ll j=1;j<=cnt&&pri[j]*i<N;j++){ vis[pri[j]*i]=1; if(i%pri[j]==0){ phi[i*pri[j]]=phi[i]*pri[j]; break; } phi[i*pri[j]]=phi[pri[j]]*phi[i]; } } for(ll i=1;i<N;i++){ sp1[i]=sp1[i-1]+phi[i]*(i&1); sp2[i]=sp2[i-1]+phi[i]*(!(i&1)); } return; } ll GetSphi(ll n){ if(n<N)return sp1[n]+sp2[n]; if(sp[n])return sp[n]; ll rest=(n%2ull==0ull)?((ll)n/2ull*(n+1ull)):((ll)(n+1ull)/2ull*n); for(ll l=2ull,r;l<=n;l=r+1ull) r=n/(n/l),rest-=(r-l+1ull)*GetSphi(n/l); return (sp[n]=rest); } void dfs(ll x,ll n){ p1[x]=p2[x]=0; if(n<N){ p1[x]=sp1[n]; p2[x]=sp2[n]; return; } dfs(x+1,n/2); p2[x]+=p1[x+1]+p2[x+1]*2ull; p1[x]+=GetSphi(n)-p2[x]; return; } int main() { prime(); scanf("%llu",&T); while(T--){ scanf("%llu",&n);dfs(0,n); printf("%llu\n",p1[0]+p2[0]*2ull-1ull); } }
- 1
信息
- ID
- 5987
- 时间
- 2500~4000ms
- 内存
- 500MiB
- 难度
- 6
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者