传送门:

  [1]:UPC比赛场

  [2]:UPC补题场

F.gu集合(数论)

•题目描述

 题目描述:
Dew有一个长为n的集合S。
有一天,他想选k个不同的元素出来做游戏。
但是Dew只有两只手,所以他只能先选出k个元素,然后拿出这k个元素中最小的两个。
事实上,Dew更喜欢这k个元素中第二小的那个。
因此他会记一个集合T的第二小值为g(T)。
此时Dew可以获得c^g(T)!的得分,其中c是一个常数,!表示阶乘。
现在你需要求出Dew从集合S中选出k个元素后,他的期望得分对998244353取模的结果。 输入:
输入共两行。
第一行三个正整数n,k,c,分别表示集合S的大小,Dew要选的元素个数,和常数c。
第二行n个互不相同的正整数ai,表示集合S中的元素。保证集合s升序。 输出:
输出一行一个非负整数,表示Dew的期望得分对998244353取模的结果。

题目描述、输入、输出

 样例输入

 样例输出
 

样例输入输出

样例解释

•题解

  在tyk的帮助下顺利AC;

  下面开始扯淡;

  第 i 个数 ai 可以作为第二小的数的条件是:

    ①存在比 ai 小的数,即 i > 1;

    ②比 ai 大的数的个数要多于 k-2,即 n-i ≥ k-2;

  对于满足条件的 ai,共有

  

  那么得到 ai 的概率为:

  

  最终答案就是 ∑ Pi×cai!

•细节处理

  对于除法取模Pi%MOD直接用逆元处理即可,关键是 cai该如何处理?

  根据费马小定理:ap-1 ≡ 1 (mod p) 可知循环节为 p-1(ap-1 ≡ a0 (mod p) ⇔ 0~p-2 为一个循环) ;

  即 ax ≡ ax%(p-1) (mod p) ;

  那么 cai≡ cai!%(p-1)(mod p);

  而 ai!%(p-1) 可以提前预处理出来;

•Code

 #include<bits/stdc++.h>
using namespace std;
#define ll long long
const int MOD=;
const int maxn=5e5+; int n,k,c;
int a[maxn];
ll fact[maxn];///fact只开到5e5就足够了,如果开到1e7,返回内存超限
ll g[(int)1e7+]; ll qPow(ll a,ll b)
{
ll ans=;
a %= MOD;
while(b)
{
if(b&)
ans=ans*a%MOD; a=a*a%MOD;
b >>= ;
}
return ans;
}
int Solve()
{
fact[]=g[]=;
for(int i=;i < maxn;++i)
fact[i]=i*fact[i-]%MOD;
for(int i=;i <= (int)1e7;++i)
g[i]=i*g[i-]%(MOD-); ll ans=;
for(int i=;i <= n;++i)
{
if(n-i < k-)
break; ll b=fact[k-]*fact[n-i-k+]%MOD*fact[n]%MOD;///概率的分母取模后的结果
///qPow(b,MOD-2)为逆元
ll p=(i-)*fact[n-i]%MOD*fact[k]%MOD*fact[n-k]%MOD*qPow(b,MOD-)%MOD; ans += p*qPow(c,g[a[i]]);
ans %= MOD;
}
return ans;
}
int main()
{
scanf("%d%d%d",&n,&k,&c);
for(int i=;i <= n;++i)
scanf("%d",a+i); printf("%d\n",Solve()); return ;
}

•感悟

  满满的数论知识,有些知识点早就学过,但就学死了,没能做到活用;

  看来,还是得多做题,多总结,要活学活用;


H.奇迹(暴力+欧拉筛法)

•题目描述

题目描述
相信奇迹的人,本身就和奇迹一样了不起。——笛亚 《星游记》
我们称一个日期为一个八位数,第1~4位构成年,第5~6位构成月,第7~8位构成日,不足位数用0补足。
同时,要求日期所代表的这一天真实存在,且年的范围为1~。
出现奇迹的日期都存在相同的特点:由“日”组成的两位数,由“月+日”组成的四位数,由“年+月+日”组成的八位数均为质数。
但并不是所有存在这样特点的日期都一定会出现奇迹。
现在,你得到了一个可能会出现奇迹的日期,然而不幸的是这个日期却是残缺的,八位中可能有若干位无法确定。
你需要知道这个日期有多少种可能,这样你才能做好充足的准备去迎接奇迹的到来。 输入
本题有多组数据。
第一行一个正整数T,表示数据组数。
接下来的T行,每行一个八位字符串。
其中第i位如果为 '-',则表示日期的第i位无法确定,否则表示日期的第i位为字符串中第i位上的数字。 输出
对每组数据,一行一个整数,表示答案。

题目描述、输入、输出

样例输入

---

样例输出

样例输入输出

--- 的  种可能的日期如下:

一共10个测试点,记c为八位字符串中 '-' 的个数。
对前9个测试点,在第i个测试点中保证c=i-。
对100%的数据保证1≤T≤。

提示

•题解(暴力+欧拉筛法预处理)

  枚举所有可能的日期,并判断①其是否符合字符串 s;②符合正常日期;

  在满足上述条件的请款下,并判断其是否符合出现奇迹的要求,如果符合,ans++;

•Code

 #include<bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
const int day[][]={{,,,,,,,,,,,,},
{,,,,,,,,,,,,}/**闰年*/};
char s[]; int prime[];
bool isPrime[];
void Prime()
{
mem(isPrime,true);
int cnt=;
isPrime[]=false;
for(int i=;i < ;++i)
{
if(isPrime[i])
prime[++cnt]=i;
for(int j=;j <= cnt && prime[j]*i < ;++j)
{
isPrime[i*prime[j]]=false;
if(i%prime[j] == )
break;
}
}
}
bool isRun(int y)
{
return (y% != && y% == )||(y% == );
}
bool isSatY(int y)
{
if(s[] != '-' && (s[]-'') != y/)
return false;
if(s[] != '-' && (s[]-'') != y/%)
return false;
if(s[] != '-' && (s[]-'') != y/%)
return false;
if(s[] != '-' && (s[]-'') != y%)
return false; return true;
}
bool isSatM(int m)
{
if(s[] != '-' && (s[]-'') != m/)
return false;
if(s[] != '-' && (s[]-'') != m%)
return false; return true;
}
bool isSatD(int d)
{
if(s[] != '-' && (s[]-'') != d/)
return false;
if(s[] != '-' && (s[]-'') != d%)
return false; return true;
}
int Solve()
{
int ans=;
for(int y=;y <= ;y++)
{
if(!isSatY(y))///判断y是否符合s
continue; for(int m=;m <= ;m++)
{
if(!isSatM(m))///判断m是否符合s
continue; for(int d=;d <= day[isRun(y)][m];d++)///判断m是否符合s
if(isSatD(d) && isPrime[m*+d] && isPrime[d] && isPrime[y*+m*+d])
ans++;
}
}
return ans;
}
int main()
{
Prime();///预处理1~99991232内的所有素数 int T;
scanf("%d",&T);
while(T--)
{
scanf("%s",s+);
printf("%d\n",Solve());
}
return ;
}

思考

上述代码耗时:

如果将三重循环的顺序颠倒以下,改成如下顺序:

 int Solve()
{
int ans=;
for(int d=;d <= ;++d)
{
if(!isPrime[d] || !isSatD(d))
continue;
for(int m=;m <= ;++m)
{
if(!isPrime[d+m*] || !isSatM(m))
continue;
for(int y=;y <= ;++y)
{
if(!isPrime[y*+m*+d] || d > day[isRun(y)][m] || !isSatY(y))
continue;
ans++;
}
}
}
return ans;
}

耗时:

快了将近三百毫秒!!!

对于此题而言,颠倒一下顺序,枚举的情况会少一下;

•坑

起初,我用vector<>存储的prime,返回 TLE,改成 int 后,AC;

看来,动态分配空间还是比提前计算出所需的空间慢一些;

UPC 2019年第二阶段我要变强个人训练赛第十六场的更多相关文章

  1. UPC Contest RankList – 2019年第二阶段我要变强个人训练赛第十六场

    E: 飞碟解除器 •题目描述 wjyyy在玩跑跑卡丁车的时候,获得了一个飞碟解除器,这样他就可以免受飞碟的减速干扰了.飞碟解除器每秒末都会攻击一次飞碟,但每次只有p/q的概率成功攻击飞碟.当飞碟被成功 ...

  2. UPC Contest RankList – 2019年第二阶段我要变强个人训练赛第十四场

    A.JOIOJI •传送门 [1]:BZOJ [2]:洛谷 •思路 在一个区间(L,R]内,JOI的个数是相等的,也就是R[J]-L[J]=R[O]-L[O]=R[I]-L[I], 利用前缀和的思想, ...

  3. UPC Contest RankList – 2019年第二阶段我要变强个人训练赛第十五场

    传送门 A: Colorful Subsequence •题意 给一个长为n的小写字母序列,从中选出字母组成子序列 问最多能组成多少种每个字母都不相同的子序列 (不同位置的相同字母也算是不同的一种) ...

  4. UPC 2019年第二阶段我要变强个人训练赛第六场

    传送门 A.上学路线 题目描述 小D从家到学校的道路结构是这样的:由n条东西走向和m条南北走向的道路构成了一个n*m的网格,每条道路都是单向通行的(只能从北向南,从西向东走). 已知小D的家在网格的左 ...

  5. 2019年第二阶段我要变强个人训练赛第八场 B.序列(seq)

    传送门 B.序列(seq) •题目描述 给出一个长度为n的序列a,每次对序列进行一下的某一个操作. •输入 第一行两个整数n,q表示序列长度和操作个数. 接下来一行n个数,表示序列a. 接下来q行表示 ...

  6. 备战省赛组队训练赛第十六场(UPC)

    传送门 题解: by 烟台大学 (提取码:8972)

  7. UPC个人训练赛第十五场(AtCoder Grand Contest 031)

    传送门: [1]:AtCoder [2]:UPC比赛场 [3]:UPC补题场 参考资料 [1]:https://www.cnblogs.com/QLU-ACM/p/11191644.html B.Re ...

  8. 备战省赛组队训练赛第十四场(UPC)

    codeforces:传送门 upc:传送门 外来题解: [1]:https://blog.csdn.net/ccsu_cat/article/details/86707446 [2]:https:/ ...

  9. 备战省赛组队训练赛第十八场(UPC)

    传送门 题解:by 青岛大学 A:https://blog.csdn.net/birdmanqin/article/details/89789424 B:https://blog.csdn.net/b ...

随机推荐

  1. linux的简单操作

    查看当前用户who am i 创建用户:sudo adduser lilei然后输入密码 查看用户:ls /home 用新用户登陆:su -l lilei 查看所属用户组:groups 用户名 新建文 ...

  2. 封装:PDO与MySQL之间的无缝切换

    以下的例子是将MySQL和PDO封装好,再无缝切换: 文件目录: config.php文件:   <?php return array( // 数据库配置 'DB' => array( ' ...

  3. Servlet过虑器

    过滤器是在请求的预处理和后处理时调用的对象. 主要用于执行转换,日志记录,压缩,加解密,输入验证等过滤任务. servlet过滤器是可插拔的,即它在web.xml文件中定义,如果从web.xml文件中 ...

  4. 小爬爬2:fiddler安装和了解fiddler

    1.解压安装就可以了 fiddler优点:抓取移动和PC机器的请求 2.首先进行证书的配置 如果不配置只能抓取http的请求,https不能抓取. 先选择,第一个"清空所有内容" ...

  5. 2019-11-1-asp-dotnet-core-简单开发P2P中央服务器

    title author date CreateTime categories asp dotnet core 简单开发P2P中央服务器 lindexi 2019-11-01 19:40:33 +08 ...

  6. oracle交互命令

    (1)说明:可以替代变量,而该变量在执行时,需要用户输入. sql>select * from emp where job=’&job’; (2)edit  说明:该命令可以编辑指定的s ...

  7. __defineGetter__和__defineSetter__在日期中的应用

    日期函数每次取年月日都要调用Date的函数,有点麻烦,通过__defineGetter__可以处理一下,就能通过Date的实例对象直接获取年月日,例如 date.year获取日期对象date的年份.月 ...

  8. [React Native]高度自增长的TextInput组件

    之前我们学习了从零学React Native之11 TextInput了解了TextInput相关的属性. 在开发中,我们有时候有这样的需求, 希望输入区域的高度随着输入内容的长度而增长, 如下: 这 ...

  9. LightOJ 1370 Bi-shoe and Phi-shoe【欧拉函数 && 质数】

    题目链接: http://lightoj.com/login_main.php?url=volume_showproblem.php?problem=1370 题意: 给定值,求满足欧拉值大于等于这个 ...

  10. JavaScript 开发者都应该知道的十个概念

    1. 原始值和引用值(Value vs. Reference) 理解对象.数组和函数是如何复制和传递到函数中的.了解引用值是被复制了什么,理解原始值是通过复制值来进行复制和传递的. 简析:ECMASc ...