翻译:
坐标线上有𝑛+2个城镇,编号从0到𝑛+1。𝑖-th镇位于𝑖点。
你在城镇1、2、…、𝑛以12的概率建造一个无线电塔(这些事件是独立的)。之后,您希望将每个塔上的信号功率设置为从1到𝑛的某个整数(信号功率不一定相同,但也不一定不同)。信号从位于城镇𝑖的信号功率𝑝的塔到达每个城市𝑐,这样|𝑐−𝑖|<𝑝。
在建立塔之后,你想要这样选择信号功率:
城镇0和𝑛+1没有从无线电塔接收到任何信号;
城镇1、2、…、𝑛分别从一个无线电发射塔接收信号。
例如,如果𝑛=5,并且您已经在城镇2、4和5中建造了塔,那么您可以将城镇2中的塔的信号功率设置为2,将城镇4和5中的塔的信号功率设置为1。这样,城镇0和𝑛+1不会从任何塔接收信号,城镇1、2和3从城镇2的塔接收信号,城镇4从城镇4的塔接收信号,城镇5从城镇5的塔接收信号。
计算这样的概率:在建造了信号塔之后,你将有办法设置信号功率以满足所有限制条件。
输入
输入的第一行(也是唯一一行)包含一个整数𝑛(1≤𝑛≤2⋅105)。
输出
打印一个整数-有一种方法可以设置信号功率,以满足所有约束条件的概率,对998244353取模。
形式上,概率可以表示为不可约分数𝑥𝑦。你需要打印𝑥⋅𝑦−1mod998244353的值,其中𝑦−1是一个整数,使得𝑦⋅𝑦−1mod998244353=1。
例子
inputCopy
2
outputCopy
748683265
inputCopy
3.
outputCopy
748683265
inputCopy
5
outputCopy
842268673
inputCopy
200000
outputCopy
202370013
请注意
第一个例子的真实答案是14:
概率是14,塔建在1号镇和2号镇,所以我们可以把它们的信号功率设为1。
第二个例子的实际答案是14:
概率为18,塔建在城镇1、2和3,所以我们可以将它们的信号功率设置为1;
在概率为18的情况下,城镇2只建造了一座塔,我们可以将其信号功率设置为2。
第三个例子的正确答案是532。请注意,尽管前面的解释对所有塔使用相同的信号功率,但事实并非如此。例如,如果𝑛=5,城镇2、4和5有塔,则可以将城镇2的塔的信号功率设置为2,城镇4和5的塔的信号功率设置为1。
思路:
这道题,我是类似于打表写出来的,证明的话,可以去看下别的博客。
可以手推一下,
1 的话是 1
2 的话是 1
3 的话是 2
4的话是 3
5的话是 5
然后分母可以直接算,然后乘逆元。
代码:
/*Looking! The blitz loop this planet to search way
Only my RAILGUN can shoot it 今すぐ
身体中を 光の速さで
駆け巡った確かな予感
掴め! 望むものなら残さず
輝ける自分らしさで
信じてるよ あの日の誓いを
この瞳に光る涙それさえも 強さになるから
*/
#include <iostream>
#include <algorithm>
#include <string.h>
#include <string>
#include <math.h>
#include <stdio.h>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<tuple>
#include<numeric>
using namespace::std;
typedef long long ll;
inline __int128 read(){
__int128 x = 0, f = 1;
char ch = getchar();
while(ch < '0' || ch > '9'){
if(ch == '-')
f = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9'){
x = x * 10 + ch - '0';
ch = getchar();
}
return x * f;
}
inline void print(__int128 x){
if(x < 0){
putchar('-');
x = -x;
}
if(x > 9)
print(x / 10);
putchar(x % 10 + '0');
}
const ll N=998244353;
int n;
ll s[200005];
ll ksm(ll x,ll y){
ll oper=1;
while (y) {
if (y&1) {
oper=oper*x%N;
}
x=x*x%N;
y>>=1;
}
return oper;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(); cout.tie();
cin>>n;
s[1]=s[2]=1;
for (int i =3; i<=n; i++) {
s[i]=(s[i-1]+s[i-2])%N;
}
ll kl=ksm(2, n);
kl=ksm(kl, N-2);
printf("%lld\n",s[n]*kl%N);
return 0;
}