比赛题目来源:2018qbxt合肥Day1

T1 最小公倍数

题意:已知正整数n,求n与246913578的最小公倍数,结果对1234567890取模

数据范围:1<=n<=10100000

由lcm = a * b / gcd(a,b) (mod 1234567890)

发现除数巨大,需要取模,考虑乘法逆元,但b,1234567890不一定互质,因此不能用乘法逆元

但由于gcd的性质,gcd(a,b) = gcd(a%b , b) , 又发现模数是b的倍数,

所以直接在用高精度a时边读边取模即可:gcd(a,b) = gcd(a%1234567890,b)

(然而考试的时候没想那么多,直接猜想到用结论求解,太不严谨了)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define ll long long
ll mol;
ll gcd(ll a, ll b)
{
return (b == 0)? a : gcd(b,a%b);
}
ll lcm(ll a, ll b)
{
return ((a * b) / gcd(a,b)) % mol;
}
char ch[100100];
int main()
{
mol = 1234567890;
ll n = 0, m = 246913578; scanf("%s",ch + 1);
ll len = strlen(ch + 1); ll rest = 0;
ll alen = len; ll x = 1e9;
while(len > 8)
{
ll now = 0;
for(int i = alen - len + 1; i <= alen - len + 8; i++)
{
now = now * 10 + ch[i] - '0';
}
rest = (now + ((rest * x)% mol)) % mol;
len -= 8;
}
for(int i = alen - len + 1; i <= alen; i++)
{
n = n * 10 + (ch[i] - '0');
}
n = n % mol;
n = ((rest * x) % mol + n) % mol;
printf("%lld\n", lcm(n, m));
return 0;
}

T2 不可逆转

洛谷上也有这道题:题目链接

题意:求有多少1~n的排列满足该排列是波动的,答案对m取模。

数据范围:1<=n<=1000 m<=109

看到这道题第一眼感觉和用LCIS求解的波浪序列有点像,但很快发现区别很大,这道题只有一个序列,而波浪序列那道题是两个序列。我一开始的思路是打表,看看这道题有没有公式,然而找了半天还是没找到规律,于是我就换了一下思路,发现这道题可能是道dp,但我想了半天还是没想到这道题的用来dp的特殊性质,于是打了个暴搜了事。

果然,所有的难写dp方程都与题目的性质有关,这道题的性质如下:

1.对于一个普通的序列,可以通过离散化使序列变成1到n的排列。

2.序列的“波动“程度是描数序列性质时常用的参数之一。

当考虑1到n的排列时,可以考虑最大的数的位置来表示序列的”波动“程度。

我们又发现,对于先降后升的序列和先升后降的序列,可以把其中的一个序列的每个数x换成n+1-x来将两种序列互换。

所以,我们只需要算其中一种序列的方案数,然后再*2即可。

计算f[i]时,枚举数i的位置j,j把序列分成了两个部分,计算该位置的方案数时,由于性质1,我们只需要先乘选左边数的组合数(左边选哪些数确定了,右边选哪些数也就确定了),然后再用C(i-1,j-1) * f[j-1] * f[i-j]即可。

对于空间,可以采用动态数组的方式进行优化。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
int n, m;
long long C[1010][1010]={},f[1010]={};
int main()
{
scanf("%d%d", &n, &m);
C[0][0] = 1;
for(int i = 1; i <= n; i++)
{
C[i][0] = 1;
for(int j = 1; j <= i; j++)
{
C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % m;
}
}
f[0] = 1; f[1] = 1;
for(int i = 2; i <= n; i++)
{
for(int j = 1; j <= i; j++)
{
if(j&1) f[i] = (f[i] + (((f[j - 1] % m) * (f[i - j] % m)) % m) * C[i - 1][j - 1]) % m;
}
}
printf("%d\n",f[n] * 2 % m);
return 0;
}

数值微分

题意:\(f[0](x) = f(x)\) \(f[i](0) = 0\) \(f[i](x) = f[i-1](x) - f[i-1](x-1)\)

输入第一行为n,m 第二行为n个数f(i) , 输出为fm , 结果对100007取模

数据范围:1<=n<=1000 1<=m<=109 0<=f[i]<100007

这道题我在考试时找到了杨辉三角,但却没时间做了,而且也没想到用组合数算杨辉三角。

首先我们猜想存在数组a使得fm = a[0] * f[i-0] + a[1] * f[i-1] + ... + a[i-1] * f[i-(i-1)]

发现a=(-1)j*C(m,j),问题来了,当n>m时怎么办,我们发现当n>m时当前数只会被前m个数影响,所以在这之前的数直接用组合数的初始值0来相乘即可,并不会影响答案,所以,我们只需要将n和m去最小值即可。

这道题还有一个坑点是100007不是质数,故不能用卢卡斯定理,只能用扩展卢卡斯定理

我们将组合数的分子和分母分解质因数(这一步也有很多细节),然后直接计算即可。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define mol 100007
#define ll long long
int n, m;
ll C[1010];
int fac[1010]={};
ll f[1010];
ll rest = 1;
void dvd(int x,int k)
{
for(int i = 2; i <= n; i++)//
{
while(x % i == 0)
{
fac[i] += k; x /= i;
}
}
if(x != 1)rest = (rest * (x % mol)) % mol;//
}
ll quickpow(ll a, int b)
{
ll ret = 1;
while(b != 0)
{
if(b&1) ret = ret * a % mol;
a = a * a % mol;
b >>= 1;
}
return ret;
}
int main()
{
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++)scanf("%lld", &f[i]);
C[0] = 1;
for(int i = 1; i <= min(m, n); i++)
{
C[i] = 1;
dvd(m - i + 1, 1); dvd(i, -1);
C[i] = C[i] * rest % mol;
for(ll j = 2; j <= n; j++)
{
if(fac[j] != 0)
{
C[i] = (C[i] * quickpow(j, fac[j])) % mol;
}
}
//printf("C[%d] = %d\n", i, C[i]);
//for(int i = 1; i <= min(m, n); i++)printf("fac[%d] = %d\n", i, fac[i]);
}
for(int i = 1; i <= n; i++)
{
ll ans = 0;
for(int j = 0; j < i; j++)
{
if(j&1)
ans = ((ans + (f[i - j] * C[j]) % mol * (-1)) % mol + mol) % mol;
else
ans = (ans + (f[i - j] * C[j]) % mol) % mol;
}
printf("%lld\n", ans);
}
return 0;
}

joxj 模拟赛 2019年9月3日的更多相关文章

  1. 36.React基础介绍——2019年12月24日

    2019年12月24日16:47:12 2019年10月25日11:24:29 主要介绍react入门知识. 1.jsx语法介绍 1.1 介绍 jsx语法是一种类似于html标签的语法,它的作用相当于 ...

  2. AHKManager.ahk AHK管理器 2019年12月15日

    AHKManager.ahk  AHK管理器  2019年12月15日 快捷键   {Alt} + {F1} ///////////////////////////////////////////// ...

  3. 开机时自动启动的AutoHotkey脚本 2019年07月08日19时06分

    ;;; 开机时自动启动的AutoHotkey脚本;; 此脚本修改时间 2019年06月18日20时48分;; 计时器创建代码段 ------------------------------------ ...

  4. 开机时自动启动的AutoHotkey脚本 2019年10月09日

    ;;; 开机时自动启动的AutoHotkey脚本 2019年10月09日;; http://www.autoahk.com/archives/16600; https://www.cnblogs.co ...

  5. Visual Studio 2019 发布活动 - 2019 年 4 月 2 日

    Visual Studio 2019 发布活动 2019 年 4 月 2 日,星期二 | 上午 9:00 (PT) 围观: https://visualstudio.microsoft.com/zh- ...

  6. 2019年5月1日起安卓应用应基于API 26开发,那么API等级是啥?

    2019年5月1日起安卓应用应基于API 26开发,那么API等级是啥? 转 https://www.ithome.com/html/android/372234.htm   据泰尔终端实验室公众微信 ...

  7. 2019年3月2日-小雨.md

    2019年3月2日, 星期六 开学已经一周了,时间好像限制了自己进步的脚步,一个人的精力有限,想做好方方面面实在是太难了,有很多事儿最后都没做的完美.相反,自己应该放下繁琐的包袱,简简单单的干一件事儿 ...

  8. 2019年5月22日 AY 程序员调侃语录

    我是AY,杨洋,做wpf开发的,最近得了一种病,程序员患得患失综合征.同事说,我年纪在变大,技术跟不上.业余之间,我原创了写了一些语录,给大家中午休息,累疲惫的时候,开心放松下. 1.活着的每一天都无 ...

  9. 【2019年05月20日】A股滚动市盈率PE历史新低排名

    2010年01月01日 到 2019年05月20日 之间,滚动市盈率历史新低排名. 上市三年以上的公司, 2019年05月20日市盈率在300以下的公司. 1 - 阳光照明(SH600261) - 历 ...

随机推荐

  1. Go-常识补充-切片-map(类似字典)-字符串-指针-结构体

    目录 Go 常识补充 Go 命名 打印变量类型科普 _ 关键字 命名规范相关 包目录规范 切片 多维切片 切片初始化的方法 多维切片初始化 切片删除元素(会略微影响效率 ,少用) copy 函数 打散 ...

  2. select into from与insert into select区别

    创建一个table2  向table2中插入 table1中name为11的所有行(前提table2不存在) select * into table2 from table1 where name=‘ ...

  3. Python的.sort()方法和sorted()比较总结

    1,.sort()方法 使用方式是:列表.sort(),作用是将原来的列表正序排序,所以它是对原来的列表进行的操作,不会产生一个新列表,例如: import random numList=[] pri ...

  4. jemeter鬓发压力测试包

    使用: 为子线程添加响应时间:https://www.cnblogs.com/duanxz/p/5464993.html 结果查看分析:聚合报告在监听器里面: https://wenku.baidu. ...

  5. eventFlow 系列 <二> 领域事件

    看一个聚合根: public class ExampleAggregate : AggregateRoot<ExampleAggregate, ExampleId>, IEmit<E ...

  6. C++string类字符串学习

    1.逆转字符串 第一种,使用algorithm中reverse函数. #include <algorithm> #include <string> #include <i ...

  7. CPU vector operations

    CPU vector operations 原文:https://blog.csdn.net/wangeen/article/details/8602028 vector operations 是现代 ...

  8. C++性能榨汁机之伪共享

    C++性能榨汁机之伪共享 来源  http://irootlee.com/juicer_false_sharing/ 前言 在多核并发编程中,如果将互斥锁的争用比作“性能杀手”的话,那么伪共享则相当于 ...

  9. 函数——箭头函数&自执行函数(二)

    一.箭头函数是在es6中添加的一种规范,它相当于匿名函数,简化了函数的定义. 1.语法 a.function用var,let,cost来表示: b.参数要写在第一个等号后面:   参数有多个,需要加一 ...

  10. com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction 问题解决

    有两种设置方法 第一种在mysql的配置文件中加入,然后重启mysql innodb_lock_wait_timeout = 500 第二种直接执行如下命令 set global innodb_loc ...