BUPT2017 springtraining(16) #4 ——基础数论
题目在这里
A.手动打表找规律得组合数
n -= 2, m -= 2, ans = C(n, m)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int Mod = 1e9 + ;
ll fac[];
ll calc(ll x, int k = Mod - ) {
ll ret = ;
for(;k;k >>= , x = x * x % Mod)
if(k & ) ret = ret * x % Mod;
return ret;
}
int main() {
ios::sync_with_stdio(false);
int n, m;
fac[] = fac[] = ;
for(int i = ;i <= ;i ++)
fac[i] = fac[i - ] * i % Mod;
while(cin >> n >> m) {
if(n > m) swap(n, m);
cout << fac[m + n - ] * calc(fac[n - ]) % Mod * calc(fac[m - ]) % Mod << endl;
}
return ;
}
B.
C.裸快速幂
#include <cstdio>
using namespace std;
double x = 1.000000011;
double n;
long long k;
int main() {
scanf("%lf %lld", &n, &k);
for(;k;k >>= , x = x * x)
if(k & ) n = n * x;
printf("%.8f\n", n);
return ;
}
D.递推式那么明显当然是矩阵快速幂啦
唯一需要注意的是,自乘矩阵的填充方式...
开始时,a1 对应 f(d) , a2 对应 f(d - 1) ...
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int d, n, m;
struct matrix1{
ll c[][];
matrix1() {
memset(c, , sizeof c);
}
void init() {
memset(c, , sizeof c);
for(int i = ;i < d;i ++) cin >> c[d - - i][d - ], c[d - - i][d - ] %= m;
for(int i = ;i < d;i ++) c[i][i - ] = ;
}
matrix1 operator *(const matrix1 &a) const {
matrix1 ret;
for(int k = ;k < d;k ++)
for(int i = ;i < d;i ++)
if(c[i][k])
for(int j = ;j < d;j ++)
ret.c[i][j] = (ret.c[i][j] + c[i][k] * a.c[k][j]) % m;
return ret;
}
};
struct matrix2{
ll c[];
matrix2() {
memset(c, , sizeof c);
}
void init() {
memset(c, , sizeof c);
for(int i = ;i < d;i ++) cin >> c[i], c[i] %= m;
}
matrix2 operator *(const matrix1 &a) const {
matrix2 ret;
for(int i = ;i < d;i ++)
for(int j = ;j < d;j ++)
ret.c[i] = (ret.c[i] + c[j] * a.c[j][i]) % m;
return ret;
}
};
int main() {
matrix1 c1;
matrix2 c2;
while(cin >> d >> n >> m, d != ) {
c1.init(), c2.init();
for(n --;n;n >>= , c1 = c1 * c1)
if(n & ) c2 = c2 * c1;
cout << c2.c[] << endl;
}
return ;
}
E.参考 CodeForces - 785D
F.看样例猜结论就好了
输出所有质数的幂就好了
#include <iostream> using std::cin;
using std::endl;
using std::cout; int n, v[], p[]; int main() {
cin >> n;
for(int i = ;i <= n;i ++) {
if(!v[i]) {
for(int j = i;j <= n;j *= i)
p[++ p[]] = j;
}
for(int j = i << ;j <= n;j += i)
v[j] = ;
}
cout << p[] << endl;
for(int i = ;i <= p[];i ++)
cout << p[i] << " ";
return ;
}
G.参考 CodeForces - 785C
H.
I.能被 6 整除一定能被 2 和 3 整除,8 和 9 同理
于是就是求 1 - n 内2 3 5 7的倍数之和
容斥原理即可
#include <iostream>
using namespace std;
int main() {
long long n;
cin >> n;
cout << n - n / - n / - n / - n / + n / + n / + n / + n / + n / + n / - n / - n / - n / - n / + n / ;
return ;
}
J.
K.对于n 的每一个因数 t
它对答案贡献为 t * phi(n / t)
效率玄学吧
#include <cstdio>
int v[], p[];
int phi(int x) {
int ret = x;
for(int i = ;1ll * p[i] * p[i] <= x;i ++)
if(x % p[i] == ) {
ret = ret - ret / p[i];
while(x % p[i] == ) x /= p[i];
}
if(x != ) ret -= ret / x;
return ret;
}
int main() {
long long n, ans;
for(int i = ;i < ;i ++) {
if(!v[i]) p[++ p[]] = i;
for(int j = ;j <= p[] && p[j] * i < ;j ++) {
v[p[j] * i] = ;
if(i % p[j] == ) break;
}
}
while(scanf("%lld", &n) != EOF) {
ans = ;
for(long long i = ;i * i <= n;i ++) {
if(n % i) continue;
ans += i * phi(n / i);
if(i * i != n) ans += n / i * phi(i);
}
printf("%lld\n", ans);
}
return ;
}
L.和式加一项减一项变成了C(n + m, n)
n,m 大 p 小且 p 保证为质数,使用卢卡斯定理
Lucas(n,m) % p = Lucas(n / p,m / p) * Comb(n % p,m % p) % p
注意lucas里面的取模后计算组合数,可能会出现 C(n,m) 里 n < m
所以Comb函数里需要判断的
考虑 p 为读入的不能预处理,所以我们有两种解决方案
1.每组数据 O(p) 预处理处阶乘 fac
Comb就可以 O(logn) 回答,理论效率 O(p + logn * log(p)(n + m))
大概就是 O(p)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int t, n, m, p;
ll fac[];
ll calc(ll x, int k = p - ) {
ll ret = ;
for(;k;k >>= , x = x * x % p)
if(k & ) ret = ret * x % p;
return ret;
}
ll C(int n, int m) {
if(n < m) return ;
return fac[n] * calc(fac[m]) % p * calc(fac[n - m]) % p;
}
ll lucas(int n, int m) {
if(!m) return ;
return C(n % p, m % p) * lucas(n / p, m / p) % p;
}
int main() {
ios::sync_with_stdio(false);
fac[] = ;
cin >> t;
while(t --) {
cin >> n >> m >> p;
for(int i = ;i < p;i ++) fac[i] = fac[i - ] * i % p;
cout << lucas(n + m, n) << endl;
}
return ;
}
2.不进行预处理,Comb直接 O(p + logn) 回答
理论效率O(p * log(p)(n + m))
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int t, n, m, p;
ll calc(ll x, int k = p - ) {
ll ret = ;
for(;k;k >>= , x = x * x % p)
if(k & ) ret = ret * x % p;
return ret;
}
ll C(int n, int m) {
if(n < m) return ;
ll ret1 = , ret2 = ;
for(int i = , j = n;i <= m;i ++, j --) {
ret1 = ret1 * i % p;
ret2 = ret2 * j % p;
}
return ret2 * calc(ret1) % p;
}
ll lucas(int n, int m) {
if(!m) return ;
return C(n % p, m % p) * lucas(n / p, m / p) % p;
}
int main() {
ios::sync_with_stdio(false);
cin >> t;
while(t --) {
cin >> n >> m >> p;
cout << lucas(n + m, n) << endl;
}
return ;
}
然而第二种的表现更好...因为都是最坏时间估计
而第一种稳定在O(p),第二种实际是几倍优于最坏效率的
M.
BUPT2017 springtraining(16) #4 ——基础数论的更多相关文章
- BUPT2017 springtraining(16) #2 ——基础数据结构
题目在这里 A.似乎是个并查集+??? B.10W的范围,似乎可以暴力来一发二分+sort? 但我猜正解可以O(nlogn)? C.单调队列入门题目 #include <cstdio> ] ...
- BUPT2017 springtraining(16) #1 题解
https://vjudge.net/contest/162590 A: 不难发现,当L=R时输出L,当L<R时输出2. B: 贪心得配对.1和n配 2和n-1配,对与对直接只要花1个代价就可以 ...
- BUPT2017 springtraining(16) #6 ——图论
题目链接 A.容易发现最后字符的对应都是一对一的 或者说我们没办法出现最后多对一或者一对多的情况 所以只要算出 ‘a’ - 'z' 每个字符最后对应的字符即可 #include <cstdio& ...
- BUPT2017 springtraining(16) #3 ——搜索与动态规划
题目在这里啊 A.最长上升子序列,范围很小所以写了简单的O(n^2)算法 #include <iostream> #define rep(i, j, k) for(int i = j;i ...
- BUPT2017 springtraining(16) #1 ——近期codeforces简单题目回顾
这里是contest 8道题全部来源于 cf 的两场contest (出题人可真懒啊 Codeforces Round #411 (Div. 2)的ABCDE Codeforces Round #40 ...
- LightOJ1214 Large Division 基础数论+同余定理
Given two integers, a and b, you should check whether a is divisible by b or not. We know that an in ...
- HDU-1576 A/B 基础数论+解题报告
HDU-1576 A/B 基础数论+解题报告 题意 求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973) (我们给定的A必能被B整除,且gcd(B,9973) = 1). 输入 数据 ...
- RSA算法原理——(2)RSA简介及基础数论知识
上期为大家介绍了目前常见加密算法,相信阅读过的同学们对目前的加密算法也算是有了一个大概的了解.如果你对这些解密算法概念及特点还不是很清晰的话,昌昌非常推荐大家可以看看HTTPS的加密通信原理,因为HT ...
- ACM&OI 基础数论算法专题
ACM&OI 基础数学算法专题 一.数论基础 质数及其判法 (已完结) 质数的两种筛法 (已完结) 算数基本定理与质因数分解 (已完结) 约数与整除 (已完结) 整除分块 (已完结) 最大公约 ...
随机推荐
- js 得到 radiobuttonlist和CheckBoxList 选中值
js 得到 radiobuttonlist和CheckBoxList 选中值 得到radiobuttonlist 选中值:var CheckBoxList=document.all.optButton ...
- ES6详解八:模块(Module)!--各种导入导出方法
[-] 基本用法 命名导出named exports 默认导出 命名导出结合默认导出 仅支持静态导入导出 各种导入和导出方式总结 modules是ES6引入的最重要一个特性. 所以以后再写模块,直 ...
- ShaderLab中vertex fragment类Shader基础格式笔记
//U3D用的shader语言叫ShaderLab,基础语法官方文档地址 //https://docs.unity3d.com/Manual/SL-Shader.html //开头指明名字,可以在别的 ...
- Vue使用html2canvas将页面转化为图片
需求是微信端将页面截屏之后保存到本地,使用了html2canvas插件 先引入插件 npm install --save html2canvas 之后在你所需要使用的页面引入 import html2 ...
- Flume特点
Flume 特点 1.可靠性 当节点出现故障时,日志能够被传送到其他节点上而不会丢失. Flume提供了三种级别的可靠性保障,从强到弱依次分别为: (1) end-to-end(收到数据agent首 ...
- 下载谷歌地图封锁IP解决办法
采用重新拨号,动态改变IP的方式.可以使用软件<易好用IP自动更换软件>
- Microsoft SQL Server学习(一)--基本概念
数据库的分类 关系型数据库 非关系型数据库 数据库的发展 数据都是以文件的形式存储在硬盘上FATFAT32NTFS LinuxEXT 数据库设计流程 文件系统缺陷 数据库的专业术语 数据库引擎服务 E ...
- Angular——内置指令
内置指令 ng-app 指定应用根元素,至少有一个元素指定了此属性. ng-controller 指定控制器 ng-show控制元素是否显示,true显示.false不显示 ng-hide控制元素是否 ...
- [Windows Server 2012] Apache+PHP安全设置
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:Win20 ...
- java 向上,向下转型
在对Java学习的过程中,对于转型这种操作比较迷茫,特总结出了此文.例子参考了<Java编程思想>. 目录 几个同义词 向上转型与向下转型 例一:向上转型,调用指定的父类方法 例二:向上转 ...