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(尺取法)的更多相关文章

  1. hdu 6205 card card card 尺取法

    card card card Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  2. HDU - 6205 card card card (尺取法)

    题意:有n堆牌,ai表示每堆牌的牌数,bi表示每堆牌的penaltyvalue,操作开始前,可以重复进行将第一堆牌挪到最后一堆这一操作.然后,对于挪完后的牌,从第一堆开始,依次取.对于每一堆牌,首先将 ...

  3. FZU-2216 The Longest Straight(尺取法)

     Problem 2216 The Longest Straight Accept: 523    Submit: 1663Time Limit: 1000 mSec    Memory Limit ...

  4. 5806 NanoApe Loves Sequence Ⅱ(尺取法)

    传送门 NanoApe Loves Sequence Ⅱ Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/131072 K ...

  5. POJ3061 尺取法

    题目大意:从给定序列里找出区间和大于等于S的最小区间的长度. 前阵子在zzuli OJ上见过类似的题,还好当时补题了.尺取法O(n) 的复杂度过掉的.尺取法:从头遍历,如果不满足条件,则将尺子尾 部增 ...

  6. POJ 2739 Sum of Consecutive Prime Numbers(尺取法)

    题目链接: 传送门 Sum of Consecutive Prime Numbers Time Limit: 1000MS     Memory Limit: 65536K Description S ...

  7. CF 701C They Are Everywhere(尺取法)

    题目链接: 传送门 They Are Everywhere time limit per test:2 second     memory limit per test:256 megabytes D ...

  8. nyoj133_子序列_离散化_尺取法

    子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:5   描述 给定一个序列,请你求出该序列的一个连续的子序列,使原串中出现的所有元素皆在该子序列中出现过至少1次. 如2 8 ...

  9. Codeforces 676C Vasya and String(尺取法)

    题目大概说给一个由a和b组成的字符串,最多能改变其中的k个字符,问通过改变能得到的最长连续且相同的字符串是多长. 用尺取法,改变成a和改变成b分别做一次:双指针i和j,j不停++,然后如果遇到需要改变 ...

随机推荐

  1. HTML简易学习笔记

    文字版地址 https://github.com/songzhenhua/github/blob/master/HTML简易学习笔记.txt

  2. jmeter之录制控制器与代理的使用

    1.       先启动jmeter,在测试计划中添加线程组 2.       选中线程组右键添加,在配置元件中点击HTTP请求默认值 3.       选中线程组右键添加,在逻辑控制器中点击录制控制 ...

  3. Kotlin将Realm提升到更高层次

    作者:Víctor Manuel Pineda 时间:Feb 14, 2017 原文链接:https://antonioleiva.com/kotlin-realm-extensions/ 当有人问我 ...

  4. Google浏览器历史版本下载地址和驱动器对应关系地址分享

    Google浏览器历史版本下载地址https://www.slimjet.com/chrome/google-chrome-old-version.php google webdriver下载地址分享 ...

  5. 【视觉SLAM14讲】ch4心得与课后题答案【仅供参考】

    答案: Q1:验证SO(3) SE(3) Sim(3)关于乘法成群 SO(3) : 由P64最开始可知,乘法代表了旋转,而SO(3)是旋转矩阵的集合, SE(3)  Sim(3)  同理(最基础的部分 ...

  6. hnust 档案管理

    问题 E: 档案管理 时间限制: 1 Sec  内存限制: 128 MB提交: 274  解决: 105[提交][状态][讨论版] 题目描述 X老师管理着学校的档案室,经常会有其他的老师来档案室存文件 ...

  7. pycharm安装scipy,安装失败

    在pycharm中安装很长时间后,还是失败. 在命令行中尝试,使用python3. 命令:python3 -m pip install scipy. 发现下载速度很慢,只有十几k每秒,但scipy包有 ...

  8. Elasticsearch相关度评分_score

    相关度评分 _score 的目的 是为了将当前查询的结果进行排序,比较不同查询结果的相关度评分没有太大意义. _score的计算方式 score(q,d) = # score(q,d) 是文档 d 与 ...

  9. 博客挪窝了 http://my.oschina.net/jrrx/blog

    1. 博客园很不错: 2. 由于各种原因,挪到了 http://my.oschina.net/jrrx/blog

  10. MySQL事物相关学习

    总结下最近对MySQL数据库的认识 Q:在手动开启事物后,commit失败是否需要显示的rollback? A:在网上查了不少资料,没有查到明确的答案.问了身边的朋友,朋友也不太了解,不过均表示显示的 ...