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不停++,然后如果遇到需要改变 ...
随机推荐
- 【Divided Two】cpp
题目: Divide two integers without using multiplication, division and mod operator. If it is overflow, ...
- CSU-1170 A Simple Problem
题目链接 http://acm.csu.edu.cn:20080/csuoj/problemset/problem?pid=1170 题目 Description 在一个由N个整数组成的数列中,最 ...
- shell文本处理工具总结
shell文本处理工具总结 为了效率,应该熟练的掌握自动化处理相关的知识和技能,能力就表现在做同样的一件事情,可以做的很好的同时,耗时还很短. 再次总结shell文本处理的相关规则,对提高软件调试效率 ...
- Day2 Activity生命周期/启动模式/最佳实践
Android是使用任务(Task)来管理活动的,这个栈被称作返回栈(Back Stack). Activity类中定义了7个回调方法: onCreate().在活动第一次被创建时调用,应该在这个方法 ...
- Edu 0空投合约源码
https://etherscan.io/address/0xa0872ee815b8dd0f6937386fd77134720d953581#code pragma solidity ^0.4.18 ...
- [LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞
[LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞 试题描述 到河北省 见斯大林 / 在月光下 你的背影 / 让我们一起跳舞吧 うそだよ~ 河北省怎么可能有 Stalin. ...
- HDU - 2814 Visible Trees
题意: m*n(1<=m,n<=100000)的森林里,起始点在(1,1),某人从(0,0)点开始看,问能看到多少棵树. 题解: 求出1~x中的每个数与1~y的数中互质的数的总和.用素数筛 ...
- 刷题总结——Interval query(hdu4343倍增+贪心)
题目: Problem Description This is a very simple question. There are N intervals in number axis, and M ...
- php中json_encode和json_decode的用法
1.json_encode基本用法:数组转字符串 <?php $arr = array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5); ...
- d3.js path路径
转自:http://www.d3js.cn/?p=68 svg的path标签被称为”可以组成任何形状的形状” SVG Path可以绘制任何形状的图形,包括矩形,圆形,椭圆,折线,多边形,直线,曲线等. ...