感觉...昨天是真的傻...

题意

T个询问,每个询问给一个n,求

$ \frac{\sum_{n}^{i = 1}Fib_{i} * i}{n * (n + 1) / 2} $

Fib是斐波那契数列,对998244353取模

然后...我昨天把n乘了之后就忘记取模了...

30分做法

设$ a_{i} = i * Fib_{i} $, 有$ a_{i} = a_{i - 1} + a_{i - 2} + Fib_{i - 1} + Fib_{i - 2} $,然后就写了一个5*5的转移矩阵,感觉很稳……

长这样:

\begin{bmatrix}
Fib_{i} & Fib{i - 1} & a_{i} & a_{i - 1} & sum_{i - 1}
\end{bmatrix}

转移矩阵长这样:

\begin{bmatrix}
1 & 1 & 1 & 0 & 0 \\
1 & 0 & 2 & 0 & 0\\
0 & 0 & 1 & 1 & 1\\
0 & 0 & 1 & 0 & 0\\
0 & 0 & 0 & 0 & 1
\end{bmatrix}

虽然这个东西也过了几万组对拍,但是我喜闻乐见地把std也顺便写挂了(捂脸),所以这两个东西都只有10分...

Code:

#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll; const ll mod = ; int testCase;
ll n; struct Matrix {
ll l1, l2, s[][]; inline void init() {
l1 = l2 = ;
memset(s, , sizeof(s));
} friend Matrix operator * (const Matrix a, const Matrix b) {
Matrix res;
res.init();
res.l1 = a.l1, res.l2 = b.l2;
for(int i = ; i < a.l1; i++)
for(int j = ; j < b.l2; j++)
for(int k = ; k < a.l2; k++)
res.s[i][j] = (res.s[i][j] + a.s[i][k] * b.s[k][j] % mod) % mod;
return res;
} inline Matrix pow(Matrix a, ll b) {
Matrix res = *this;
for(; b > ; b >>= ) {
if(b & ) res = res * a;
a = a * a;
}
return res;
} inline void print() {
for(int i = ; i < l1; i++, printf("\n"))
for(int j = ; j < l2; j++)
printf("%lld ", s[i][j]);
} } f; inline ll pow(ll x, ll y) {
ll res = ;
for(x %= mod; y > ; y >>= ) {
if(y & ) res = res * x % mod;
x = x * x % mod;
}
return res;
} inline ll solve() {
if(n == ) return 1LL;
if(n == ) return 3LL; Matrix g;
g.init();
g.l1 = , g.l2 = ;
g.s[][] = g.s[][] = g.s[][] = ;
g.s[][] = ;
g.s[][] = ;
// g.print(); g = g.pow(f, n - ); // g.print(); return g.s[][];
} int main() {
f.init();
f.l1 = f.l2 = ;
f.s[][] = f.s[][] = f.s[][] = ;
f.s[][] = f.s[][] = f.s[][] = f.s[][] = ;
f.s[][] = f.s[][] = ;//f.s[4][2] = 1;
f.s[][] = ; // f.print(); for(scanf("%d", &testCase); testCase--; ) {
scanf("%lld", &n);
ll tmp = n * (n + ) / ;
ll inv = pow(tmp, mod - );
ll sum = solve();
printf("%lld\n", inv * sum % mod);
}
return ;
}

100分做法  

找规律题惹不起a...

$sum_{n} = n * Fib_{n + 2} - Fib_{n + 3} + 2$

所以就变成一个斐波那契了
并不能推导出来...

Code:

#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll; const ll mod = ; int testCase;
ll n; struct Matrix {
ll s[][]; inline void init() {
memset(s, , sizeof(s));
} friend Matrix operator * (const Matrix a, const Matrix b) {
Matrix res;
res.init();
for(int i = ; i <= ; i++)
for(int j = ; j <= ; j++)
for(int k = ; k <= ; k++)
res.s[i][j] = (res.s[i][j] + a.s[i][k] * b.s[k][j] % mod) % mod;
return res;
} inline Matrix pow(ll b) {
Matrix res, a = *this;
res.init();
for(int i = ; i <= ; i++) res.s[i][i] = ;
for(; b > ; b >>= ) {
if(b & ) res = res * a;
a = a * a;
}
return res;
} } f; inline ll pow(ll a, ll b) {
ll res = ;
for(; b > ; b >>= ) {
if(b & ) res = res * a % mod;
a = a * a % mod;
}
return res;
} inline ll solve() {
Matrix res = f.pow(n + );
return (res.s[][] * n % mod - res.s[][] + + mod) % mod;
} int main() {
f.init();
f.s[][] = f.s[][] = f.s[][] = ;
for(scanf("%d", &testCase); testCase--; ) {
scanf("%lld", &n);
ll inv = pow((n * (n + ) / )% mod, mod - );
ll sum = solve();
// printf("%lld %lld\n", sum, inv);
printf("%lld\n", sum * inv % mod);
}
return ;
}

感觉还挺有趣的……

Luogu U15118 萨塔尼亚的期末考试(fail)的更多相关文章

  1. 萨塔尼亚的期末考试(fail)

    题解: 这题比较妙啊... 首先暴力自己算是找不出规律的 有一种直觉就是可以把式子变成{f[1]+...f[n]}+{f[2]+...+f[n]}+{f[3]+...+f[n]}... 然后看了题解发 ...

  2. [luogu_U15118]萨塔尼亚的期末考试

    https://zybuluo.com/ysner/note/1239615 题面 \(T\)次询问,求出\[\sum_{i=1}^n\frac{i}{\frac{n(n+1)}{2}}fib_i\] ...

  3. [luogu] P3745 [六省联考2017]期末考试 (贪心)

    P3745 [六省联考2017]期末考试 题目描述 有 \(n\) 位同学,每位同学都参加了全部的 \(m\) 门课程的期末考试,都在焦急的等待成绩的公布. 第 \(i\) 位同学希望在第 \(t_i ...

  4. Vigenère Cipher 维吉尼亚加解密算法

    维吉尼亚的加解密有两种方法. 第一种是查表:第一行为明文,第一列为密钥,剩余的为对应的密文 第二种方法是转化计算法:逐个将字符转化为从零开始的数字,对数字进行加密/解密后,再转化为字符. 本文要用c+ ...

  5. [加密]C#实现维吉尼亚加密与解密(解密前提为已知密匙)

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  6. 随机练习:C#实现维吉尼亚加密与解密(解密前提为已知密匙)

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  7. 维吉尼亚密码-攻防世界(shanghai)

    维吉尼亚密码 维吉尼亚密码是使用一系列 凯撒密码 组成密码字母表的加密算法,属于多表密码的一种简单形式. 加密原理 维吉尼亚密码的前身,是我们熟悉的凯撒密码. 凯撒密码的加密方式是依靠一张字母表中的每 ...

  8. [CTF]维吉尼亚密码(维基利亚密码)

    [CTF]维吉尼亚密码(维基利亚密码) ----------------------百度百科 https://baike.baidu.com/item/维吉尼亚密码/4905472?fr=aladdi ...

  9. 【Luogu】P3745期末考试(三分)

    题目链接 我是怎么把“期末考试”在本地写成“假期计划”的 qwq???? 本题把学生和卷子都排个序,按出成绩最晚时间三分. 三分之后可以O(n)的时间统计答案,因为修改卷子出成绩的时间可以贪心计划. ...

随机推荐

  1. XML DOM - Range 对象

    Range对象 Range对象表示文档的连续范围区域,如用户在浏览器窗口中用鼠标拖动选中的区域.   dom标准Range对象 在IE中使用TextRange对象 range对象常用的建立方法在开发中 ...

  2. Spark入门实战系列

    转自:http://www.cnblogs.com/shishanyuan/p/4699644.html 这一两年Spark技术很火,自己也凑热闹,反复的试验.研究,有痛苦万分也有欣喜若狂,抽空把这些 ...

  3. RabbitMQ入门Demo

    之前环境安装已经介绍过了,下面直接跑个Demo. 1.添加Maven依赖 <dependency> <groupId>org.springframework.amqp</ ...

  4. Git在不同环境换行符设置

    首先我们在eclipse查看两个环境文件的换行符区别: 产生背景 关于“回车”(carriage return)和“换行”(line feed)这两个概念的来历和区别.在计算机还没有出现之前,有一种叫 ...

  5. SpringCloud基础教程学习记录

    这个学习记录是学习自翟永超前辈的SpringCloud的基础教程. 自己写这个教程的目的主要是在于,想要更凝练总结一些其中的一些实用点,顺便做个汇总,这样自己在复习查看的时候更加方便,也能顺着自己的思 ...

  6. 如何禁用 a 标签的点击事件

    a标签是没有disable属性的 ,如果想用disable 禁用a标签的点击事件,也可以实现: 1.a标签要用disable属性,必须和pointer-events属性一起使用, html代码: &l ...

  7. Xmodem通信协议实例

    在工作时串口通信的过程中需要传输文件,这里就就需要使用通信协议,此时选择的是Xmodem协议作简要研究 1.什么是Xmodem协议 Xmodem协议是串口通信中广泛使用到的异步文件传输协议.以128字 ...

  8. 解决sql脚本文件太大无法打开的问题

    as we known,sql数据库高版本向低版本还原是不太可能但是又经常会碰到的事,今天实测了一种方法 步骤:任务—>生成脚本—> 下一步->高级,选择数据库版本和编写脚本数据类型 ...

  9. [转] LINUX 三种网络连接模式

     Linux下NAT模式和桥接模式的网络配置 最近在配置linux虚拟机的时候发现有很多坑,现在记录下来以防日后又跳到坑里. 我的运行环境是:主机 windows 7  虚拟机 Virtualbox ...

  10. c# 使用GetPrivateProfileString 读ini数据 失败

    项目中用到 GetPrivateProfileString但是使用中, 发现 无法读出 ini 配置中的值, 比如Enable_log =3 我读到的是 API设置的默认值. 网上说可能时字符集编码的 ...