Jzoj4307 喝喝喝
2017-10-06 07:47
127 查看
显然,如果令w[i]=s[i]-k,那么显然s[i]|w[j]就是s[j]%s[i]=k的必要条件,那么我们倒序枚举每个开头l,枚举w[l]的每个因数看看他在s[l+1]~s
中有没有出现,求出一个位置最靠近l的r,那么贡献就是r-l
#include<stdio.h> #include<string.h> #include<algorithm> #define INF 0x7f7f7f7f using namespace std; int n,k,s[100010],w[100010]; int f[100010],l,r,xl=INF; long long ans=1; int check(int x){ if(x<0) return INF; if(x==0) return xl; int mn=INF; for(int i=1;i*i<=x;++i) if(x%i==0){ if(i>k) mn=min(mn,f[i]); i=x/i; if(i>k) mn=min(mn,f[i]); i=x/i; } return mn; } int main(){ freopen("drink.in","r",stdin); freopen("drink.out","w",stdout); scanf("%d%d",&n,&k); memset(f,127,sizeof f); for(int i=1;i<=n;++i) scanf("%d",s+i),w[i]=s[i]-k; f[s ]=n; l=r=n+1; for(int i=n-1;i;--i){ int x=check(w[i]); if(x<r) { l=i; r=x; } ans+=r-i; f[s[i]]=i; if(s[i]>k) xl=i; } printf("%lld\n",ans); }
相关文章推荐
- JZOJ 4307. 【NOIP2015模拟11.3晚】喝喝喝
- JZOJ4307. 【NOIP2015模拟11.3晚】喝喝喝
- JZOJ4718. 准备食物2
- 【挖坑记】JZOJ 4729 道路修建
- [JZOJ3052] 剪草
- 【JZOJ 3051】单元格
- 【jzoj4715】【树上路径】【树】【分治】【点分治】
- 【JZOJ 4771】 爬山
- 【JZOJ 4782】 Math
- [OICamp 2016 Day 5/JZOJ4779]鞍点
- 【JZOJ junior 2059】 稀有逛超市
- 【CQOI2014】【BZOJ 3506】【JZOJ 3599】排序机械臂
- 【时光回溯】【JZOJ3566】【GDKOI2014】阶乘
- 【JZOJ 4799】 我的快乐时代
- JZOJ 4810 【NOIP2016提高A组五校联考1】道路规划
- 【JZOJ 4810】【NOIP2016提高组 五校联考1】道路规划
- 旅行 jzoj 1281
- 【JZOJ 4813】running
- 【JZOJ4805】ksum
- JZOJ 4819. 【NOIP2016提高A组模拟10.15】算循环