【jzoj4860】【分解数】【线性筛法】
2016-11-07 22:36
197 查看
题目大意
给出一个数,每次可以分成两个互质的数,求可以分解多少次。
解题思路
其实就是求不同的质因子个数,可以用线筛求出每个数的前驱来分解质因数,因为卡空间所以要牺牲时间来换空间少存一些值。
code
#include<set> #include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define LL long long #define LD double #define max(a,b) ((a>b)?a:b) #define min(a,b) ((a>b)?b:a) #define fo(i,j,k) for(int i=j;i<=k;i++) #define fd(i,j,k) for(int i=j;i>=k;i--) using namespace std; int const maxn=1e6,maxa=1e7; int n,k,cnttl,cnttr,a[maxn+1],ss[664579+1],pre[maxa+1],cntl[maxa+1],cntr[maxa+1], inf=1<<29,mod=1e4+7; int main(){ //freopen("dec.in","r",stdin); //freopen("dec.out","w",stdout); freopen("d.in","r",stdin); freopen("d.out","w",stdout); scanf("%d%d",&n,&k);k++; fo(i,1,n)scanf("%d",&a[i]); fo(i,2,maxa){ if(!pre[i])ss[++ss[0]]=i; fo(j,1,ss[0]) if(i*ss[j]<=maxa){ pre[i*ss[j]]=i; if(!(i%ss[j]))break; }else break; } int l=1,r=1,tmp,tmp2,tmp3,ans=0; fo(i,1,n){ tmp2=a[i]; for(;pre[a[i]];){ tmp=a[i]/pre[a[i]]; if(!(cntl[tmp]++))cnttl++; if(!(cntr[tmp]++))cnttr++; for(;!(a[i]%tmp);a[i]/=tmp); } if(a[i]!=1){ if(!(cntl[a[i]]++))cnttl++; if(!(cntr[a[i]]++))cnttr++; } a[i]=tmp2; for(;cnttl>k;){ tmp2=a[l]; for(;pre[a[l]];){ tmp=a[l]/pre[a[l]]; if(!(--cntl[tmp]))cnttl--; for(;!(a[l]%tmp);a[l]/=tmp); } if(a[l]!=1){ if(!(--cntl[a[l]]))cnttl--; } a[l]=tmp2; l++; } for(;1;){ tmp3=a[r];tmp2=0; for(;pre[a[r]];){ tmp=a[r]/pre[a[r]]; tmp2+=cntr[tmp]==1; for(;!(a[r]%tmp);a[r]/=tmp); } if(a[r]!=1){ tmp2+=cntr[a[r]]==1; } a[r]=tmp3; if(cnttr-tmp2<k)break; tmp3=a[r]; for(;pre[a[r]];){ tmp=a[r]/pre[a[r]]; if(!(--cntr[tmp]))cnttr--; for(;!(a[r]%tmp);a[r]/=tmp); } if(a[r]!=1){ if(!(--cntr[a[r]]))cnttr--; } a[r]=tmp3; r++; } if((cnttl==k)&&(cnttr==k))ans=(ans+r-l+1)%mod; } printf("%d",ans); return 0; }
相关文章推荐
- 【JZOJ4860】【NOIP2016提高A组集训第7场11.4】分解数
- JZOJ4860【NOIP2016提高A组集训第7场11.4】分解数
- 【jzoj4782】【Math】【线性筛法】
- 线性代数与数值方法--矩阵分解
- 线性筛法求解积性函数(莫比乌斯函数)
- 无处不在的线性分解 转自 林达华
- 一个线性时间复杂度的质因数分解函数(查找全部的素数、得到全部的质因数分解个数)
- MIT18.06线性代数课程笔记4a:矩阵的LU分解
- 求质数3 线性筛法 C实现
- 线性筛法--------2013年1月2日
- 线性代数之奇异值(SVD)分解
- 线性代数之奇异值(SVD)分解
- POJ 3604 Professor Ben(合数唯一分解,筛法素数表)
- 线性代数学习2 线性相关、生成子空间、范数、特征分解
- 线性筛法--------2013年1月2日
- 线性筛法,留着复习
- 清华大学公开课线性代数2——第3讲:奇异值分解
- 线性筛法(欧拉筛)
- 线性筛法
- 线性筛法--------2013年1月2日