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不停++,然后如果遇到需要改变 ...
 
随机推荐
- 《Cracking the Coding Interview》——第8章:面向对象设计——题目2
			
2014-04-23 17:45 题目:假设有个呼叫中心,有接线员.经理.主管三种角色.如果接线员无法处理呼叫,就上传给经理:如果仍无法处理,则上传给主管.请用代码描述这一过程. 解法:第一眼觉得这题 ...
 - script通过script标签跨域加载数据
			
/********************************************************** 说明:跨域请求数据Javascript组件 ------------------ ...
 - iOS笔记056 - UI总结02
			
九宫格布局 UICollectionViewController 创建控制器一定要指定默认的布局样式. // 加载一个九宫格布局的控制器,必须指定布局样式 UICollectionViewFlowLa ...
 - eclipse importing maven projects 卡顿
			
导入一个maven工程后 一直显示 importing maven projects 9% 解决办法: 找到eclipse安装目录下的eclipse.ini 在最后加入 -vm $JAVA_HOME% ...
 - json字符串数组判断其中
			
嘴挺笨的描述不清,直接看图,console.log(data1)是下图 获取的table中的数据组成的json对象(这里我不明白json对象啊json字符串啊json数组啊.我只会- 需要啥就转换成啥 ...
 - [bzoj3456] 城市规划 [递推+多项式求逆]
			
题面 bzoj权限题面 离线题面 思路 orz Miskcoo ! 先考虑怎么算这个图的数量 设$f(i)$表示$i$个点的联通有标号无向图个数,$g(i)$表示$n$个点的有标号无向图个数(可以不连 ...
 - [poj] 2286 The Rotation Game || ID-DFS
			
原题 有1234四个数字,每个数字八个.有八种方向的移动,使得操作后中间八个方块的数字相同,求最小操作步数. 对于这种求最小步数的看起来就是dfs的题,就ID-DFS就好了. //不知道为什么都是ID ...
 - 公共文件js加载
			
头部:例如 <header id="header" class="clearfix"> <a class="col-xs-9&quo ...
 - server reached pm.max_children setting (5), consider raising it
			
先查看日志 /data1/server/php-cgi/var/log/php-fpm.log[19-Dec-2012 11:41:13] WARNING: [pool www] server rea ...
 - java8 获取对象中满足条件的金额之和
			
记录一个小笔记:获取一个对象中,支付成功的金额之和: Long sum = list.stream().filter(o -> o.getStatus() == SUCCESS).mapToLo ...