818E - Card Game Again(尺取法)
818E - Card Game Again
题意
给出一个数列,选择连续的一段使得这些数字的乘积是 k 的倍数,问合法的方案数。
分析
尺取法。设 num 为连续的数的乘积,只要对于 k 的每个素因子,num 相应的素因子的个数大于等于它。那么不仅这个数,后面乘上任意数都是 k 的倍数。这时候就不用移动 r 指针了,移动 l 指针,即不断的去掉前面的数。
计算时可以用 map 存下素因子及其个数。
code
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 5;
const int MAXN = 3e4 + 2e3;
const int INF = 2e9 + 1;
int is[MAXN];
vector<int> prime;
void init() {
for(int i = 2; i < MAXN; i++) {
if(!is[i]) {
prime.push_back(i);
for(ll j = 1LL * i * i; j < MAXN; j += i) {
is[j] = 1;
}
}
}
}
int a[N];
struct nd {
int x, cnt;
};
vector<nd> getFactor(int x) {
vector<nd> v;
for(int i = 0; 1LL * prime[i] * prime[i] <= x; i++) {
int c = 0;
while(x % prime[i] == 0) {
x /= prime[i];
c++;
}
if(c) v.push_back(nd{prime[i], c});
}
if(x > 1) v.push_back(nd{x, 1});
return v;
}
map<int, vector<nd> > mp;
int C[MAXN];
set<int> st;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
init();
int n, k;
cin >> n >> k;
for(int i = 0; i < n; i++) {
cin >> a[i];
}
int l = 0, r = 0;
vector<nd> K = getFactor(k);
ll ans = 0;
int state = 1;
while(l < n && r < n) {
vector<nd> X;
if(state) {
if(!mp.count(a[r])) mp[a[r]] = getFactor(a[r]);
X = mp[a[r]];
for(int i = 0; i < X.size(); i++) {
if(X[i].x > MAXN) st.insert(X[i].x);
else C[X[i].x] += X[i].cnt;
}
} else {
if(!mp.count(a[l])) mp[a[l]] = getFactor(a[l]);
X = mp[a[l]];
for(int i = 0; i < X.size(); i++) {
if(X[i].x > MAXN) st.erase(X[i].x);
else C[X[i].x] -= X[i].cnt;
}
l++;
}
int flg = 0;
for(int i = 0; i < K.size(); i++) {
if(K[i].x > MAXN) { if(!st.count(K[i].x)) { flg = 1; break; } }
else if(K[i].cnt > C[K[i].x]) { flg = 1; break; }
}
if(flg) {
r++;
state = 1;
} else {
ans += n - r;
if(l == r) { r++; l++; state = 1; memset(C, 0, sizeof C); st.clear(); }
else state = 0;
}
}
cout << ans << endl;
return 0;
}
818E - Card Game Again(尺取法)的更多相关文章
- hdu 6205 card card card 尺取法
card card card Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- HDU - 6205 card card card (尺取法)
题意:有n堆牌,ai表示每堆牌的牌数,bi表示每堆牌的penaltyvalue,操作开始前,可以重复进行将第一堆牌挪到最后一堆这一操作.然后,对于挪完后的牌,从第一堆开始,依次取.对于每一堆牌,首先将 ...
- FZU-2216 The Longest Straight(尺取法)
Problem 2216 The Longest Straight Accept: 523 Submit: 1663Time Limit: 1000 mSec Memory Limit ...
- 5806 NanoApe Loves Sequence Ⅱ(尺取法)
传送门 NanoApe Loves Sequence Ⅱ Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/131072 K ...
- POJ3061 尺取法
题目大意:从给定序列里找出区间和大于等于S的最小区间的长度. 前阵子在zzuli OJ上见过类似的题,还好当时补题了.尺取法O(n) 的复杂度过掉的.尺取法:从头遍历,如果不满足条件,则将尺子尾 部增 ...
- POJ 2739 Sum of Consecutive Prime Numbers(尺取法)
题目链接: 传送门 Sum of Consecutive Prime Numbers Time Limit: 1000MS Memory Limit: 65536K Description S ...
- CF 701C They Are Everywhere(尺取法)
题目链接: 传送门 They Are Everywhere time limit per test:2 second memory limit per test:256 megabytes D ...
- nyoj133_子序列_离散化_尺取法
子序列 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 给定一个序列,请你求出该序列的一个连续的子序列,使原串中出现的所有元素皆在该子序列中出现过至少1次. 如2 8 ...
- Codeforces 676C Vasya and String(尺取法)
题目大概说给一个由a和b组成的字符串,最多能改变其中的k个字符,问通过改变能得到的最长连续且相同的字符串是多长. 用尺取法,改变成a和改变成b分别做一次:双指针i和j,j不停++,然后如果遇到需要改变 ...
随机推荐
- 理解web缓存
web缓存是web用于临时存储各种资源的一种技术. web缓存大概分两种,一种是前端缓存,另一种是后端端缓存. 前端缓存 浏览器缓存 浏览器自带的缓存机制. 比如说浏览器后退前进的动作,一般使用浏览器 ...
- SQL 与关系代数
Table of Contents 前言 关系与表 关系代数的基本运算 投影 选择 并运算 集合差运算 笛卡尔积 更名运算 关系代数的附加运算 集合交运算 连接运算 自然连接 内连接 外连接 结语 前 ...
- google protobuf 中的proto文件编写规则
1. 简单介绍 protobuf文件:就是定义你要的消息(类似Java中的类)和消息中的各个字段及其数据类型(类似java类中的成员变量和他的数据类型) 2. Protobuf消息定义 消息由至少一个 ...
- 【bzoj1856】[Scoi2010]字符串 Catalan数
题目描述 lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数不能少于0的个数.现在lxhgww想要知道满足 ...
- hdu1007 平面最近点对(暴力+双线程优化)
突发奇想,用双线程似乎可以优化一些暴力 比如说平面最近点对这个题目,把点复制成2份 一份按照x排序,一份按照y排序 然后双线程暴力处理,一份处理x,一份处理y 如果数据利用x递减来卡,那么由于双线程, ...
- Lights inside 3D Grid LightOJ - 1284 (概率dp + 推导)
Lights inside 3D Grid LightOJ - 1284 题意: 在一个三维的空间,每个点都有一盏灯,开始全是关的, 现在每次随机选两个点,把两个点之间的全部点,开关都按一遍:问k次过 ...
- 【CF Round 439 C. The Intriguing Obsession】
time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...
- 【CZY选讲·Triangle】
题目描述 长度为的铁丝,你可以将其分成若干段,并把每段都折成一个三角形.你还需要保证三角形的边长都是正整数并且三角形两两相似,问有多少种不同的分法. 数据范围 1≤≤10^6 题解: ①相 ...
- Codeforces 932.B Recursive Queries
B. Recursive Queries time limit per test 2 seconds memory limit per test 256 megabytes input standar ...
- 转: listview异步图片加载之优化篇(android)
Listview异步加载之优化篇 关于listview的异步加载,网上其实很多示例了,总体思想差不多,不过很多版本或是有bug,或是有性能问题有待优化.有鉴于此,本人在网上找了个相对理想的版本并在此基 ...