题解:SP20038 SNGLOOP1 - Easiest Loop 1
I_am_Trisolaris
·
2026-10-19 17:31:35
·
题解
本题是一道比较水的数学题
求解 S_n 的通项公式
首先,我们来看 S_n 的通项公式。想要求它的通项公式,我们可以先求它的递推式,递推式显然是 S_n = 3S_{n - 1} + 5n ,其中 S_0 为一个未知的已知值(?)。
这个式子如果不加上后面的一坨,即 S_n = 3S_{n - 1} ,那么通项公式为 S_n=3^nS_0 。再看后面,显然,你的后面式子是第 i 个式子时出现的,那么你到 n 一共乘了 n-i-1 个 3 。所以合起来的通项公式就是下面一大坨:
S_n = 3^nS_0 + \sum^{n - 1}_{i = 0}3^{n - i - 1}5(i+1)
化简左式
然后,我们把这一坨带回左式
\begin{aligned}
LHS&=(2n+3)(p-1) + \frac{4}{5}(3^npS_0 + p\sum^{n - 1}_{i = 0}3^{n - i - 1}5(i+1) - 3^mS_0 - \sum^{m - 1}_{i = 0}3^{m - i - 1}5(i+1))\\
&=(2n+3)(p-1)+\frac{4}{5}(3^npS_0+p\sum_{i=0}^{n-1}3^{n-i-1}5(i+1)-3^mS_0-\sum_{i=0}^{m-1}3^{m-i-1}5(i+1))\\
&=(2n+3)(p-1)+\frac{4}{5}\left[3^npS_0-3^mS_0+p\sum_{i=0}^{n-1}3^{n-i-1}5(i+1)-\sum_{i=0}^{m-1}3^{m-i-1}5(i+1)\right]\\
&=(2n+3)(p-1)+\frac{4}{5}\left[3^npS_0-3^mS_0+\frac{5p}{4}(3^{n+1}-2n-3)-\frac{5}{4}(3^{m+1}-2m-3)\right]\\
&=(2n+3)(p-1)+\frac{4}{5}(3^npS_0-3^mS_0)+p(3^{n+1}-2n-3)-(3^{m+1}-2m-3)\\
&=(2n+3)p-(2n+3)+p3^{n+1}-p(2n+3)-3^{m+1}+2m+3+\frac{4}{5}(p3^n-3^m)S_0\\
&=p3^{n+1}+2m-2n-3^{m+1}+\frac{4}{5}(p3^n-3^m)S_0\\
&=2m-2n+(3+\frac{4}{5}S_0)(p3^n-3^m)
\end{aligned}\\
化简右式
再看右式,右式也是非常的简单,即
RHS=2m-2n
求解 p 的值
所以左式等于右式,即
2m-2n+(3+\frac{4}{5}S_0)(p3^n-3^m)=2m-2n\\
\therefore (3+\frac{4}{5}S_0)(p3^n-3^m)=0\\
\therefore p3^n=3^m\\
\therefore p=3^{m-n}\\
这样,我们得到了最终的式子。
求 p 的末尾
最后一步,找规律,显然,3^x 的末尾规律是 3,9,7,1 ,我们只需要求出 (m - n) 模 4 的余数就可以了,代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int T;
cin>>T;
while(T--)
{
int n, m;
cin>>n>>m;
int g = m - n;
g %= 4;
if(g == 0) cout<<1<<endl;
if(g == 1) cout<<3<<endl;
if(g == 2) cout<<9<<endl;
if(g == 3) cout<<7<<endl;
}
return 0;//洛谷你告诉我这是橙,这肯定有个黄啊
}
ok,大功告成,感谢您的观看。(本文耗费作者两个小时,点个赞在走吧,谢谢。