近期题目整理(6.1)

Posted ace-monster

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了近期题目整理(6.1)相关的知识,希望对你有一定的参考价值。

近期训练题目思维整理(6.1)

2019 福建省赛 题目A

·题意

计算
\[\sum_x=1^p-3x^j\modp\]
其中,\(p\)为质数,\(n\le10^9\)。

·思路

结论很简单,以下式子成立\[\sum_x=1^px^j\modp=0\]
那么我们只要求最后3项就可以获得答案
这个结论可以依靠打表获得,比赛时很多队依靠打表发现了结论轻松的过了这题,而我们的电脑空闲长达1个小时却没有尝试打表。对于一些没有思路的题目不妨可以依靠这种方法寻找规律

2019 福建省赛 题目J

还没补,大概思路有,补完填坑

2019.5 FZU月赛 题目D

·题意

对于有根树T,定义\[f(T)=\sum_x,y\in V(T)且x\le ydist(x,y)\]求\(n\)个节点的有根树T中,满足\(f(T)_max\)和\(f(T)_min\)的树分别有多少种。

·思路

考虑无根树,满足\(f(T)_max\)的树一定是一条链,但是注意正链与反链相同,因此共有\[\frac12\prod_i=1^ni\]种。
而满足\(f(T)_min\)的树肯定是菊花树(一个点连着剩下\(n-1\)个点),共有\[n\]种。
然后考虑有根情况,而对于有根树根不同树便不同。因为n个点每个点都可以作为根,因此有根树的数量就是无根树的数量乘以\(n\)。
因此,结论:
\[f(T)_max=\fracn2\prod_i=1^ni\]
\[f(T)_min=n^2\]

AC代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 1e9+7;
const ll inv = 5e8+4;
int main()

    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    ll n;
    cin >> n;
    ll ans1 = 0, ans2 = 0;
    if(n == 1) ans1 = ans2 = 1;
    else if(n == 2) ans1 = ans2 = 2;
    else
        ans1 = 1, ans2 = (n*n)%mod;
        for(ll i = 2;i <= n;i++)
            ans1 = (ans1*i) % mod;
        ans1 = ans1*n%mod*inv%mod;
    
    cout << ans1 << ' ' << ans2 << endl;
    return 0;

Codeforces 691E - Xor-sequences

691E - Xor-sequences

·题意

长度为n的数组中选取k个数字组成序列x(可重复选取),要求\(x_i\oplusx_i+1\)二进制下1的位数是3的倍数,求满足条件的数组的数量。

·思路

设二维数组\(d_i,j\)保存序列\(x_i,x_j\)是否满足要求,满足要求为1不满足为0,二维数组\(c_i,j\)保存的是某一长度下\(x_i...y_i\)(即以\(x_i\)为序列开头,\(y_i\)为序列结尾)的方案数。
很显然当长度为1时,\(d_i,j=c_i,j\).
那么长度为3时,二维数组\(c_i,j\)所表示的意义(长度)可以由以下转移式转移:\[c_i,j = \sum_n^k=1d_i,k*d_k,j\]可以理解成枚举k,以i开头k结尾的序列和以k开头j结尾的序列拼接起来是否合法,有多少种合法方案累加起来。而这个公式就是矩阵乘法
同理,当长度大于3时,\[c_i,j = \sum_n^k=1c_i,k*d_k,j\],这样就可以使矩阵c的意义由\(l-1\)转移到\(l\),那么转移到长度为k就要乘矩阵d共\(k-1\)次。
那么做法就很明显了,先预处理\(d_i,j\),而由于长度为2时\(c_i,j=d_i,j\),而我们要让矩阵c乘以矩阵d共\(k-1\)次,也就是d矩阵的\(k-1\)次幂。这题就转换成矩阵快速幂了。

·AC代码链接

Codeforces 691F - Couple Cover

Codeforces 691F

·题意

从n个数字中取2个,得分为两个数字之积,当得分高于一个阈值p时获胜。给你m个数字p,问你以当前p为阈值时获胜的数字对的数量。

·思路

先预处理每个数字的数量,然后直接枚举数字\(i,j\),计算有多少数字对可以凑成\(i*j\),最后对数组求前缀和就可以计算失败的数字对。
这题直接枚举数字\(i,j\)复杂度是\(n^2\),而我们可以换个思路,由枚举\(i,j\)计算\(i*j\)转换为枚举\(i,i*j\),因为阈值p是有上限的。这样枚举的复杂度就由\(n^2\)转换为\(n\logn\)。

·AC代码链接

前缀和相关性质整理

以上是关于近期题目整理(6.1)的主要内容,如果未能解决你的问题,请参考以下文章

VS2015 代码片段整理

小程序各种功能代码片段整理---持续更新

常用python日期日志获取内容循环的代码片段

最全最详细publiccms常用的代码片段

C#常用代码片段备忘

Andrew Ng 吴恩达近期论文整理