zoukankan      html  css  js  c++  java
  • Jzoj4307 喝喝喝

    显然,如果令w[i]=s[i]-k,那么显然s[i]|w[j]就是s[j]%s[i]=k的必要条件,那么我们倒序枚举每个开头l,枚举w[l]的每个因数看看他在s[l+1]~s[n]中有没有出现,求出一个位置最靠近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]]=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
    ",ans);
    }

  • 相关阅读:
    详解扩展欧几里得算法(扩展GCD)
    NOIP 2012 同余方程
    NOIP 2011 观光公交
    NKOJ4330 逛公园
    NKOJ 7.7练习题A IP地址
    NKOJ3777 卡牌操作
    NKOJ3772 看电影
    NKOJ3765 k个最小和
    NKOJ3775 数列操作
    NKOJ3768 数列操作
  • 原文地址:https://www.cnblogs.com/Extended-Ash/p/7774385.html
Copyright © 2011-2022 走看看