• 【UOJ #267】【清华集训2016】魔法小程序(前缀和)


    传送门

    可以显然c[i]c[i]看出就是把aa作为该位进制时的数
    满足每一位都不大于iijjb[j]b[j]的和

    首先显然位数可以弄到O(log)O(log),把所有为1的aa跳过即可

    然后乱减一下 把其他所有多的bb减掉就可以把当前这一个求出来了

    #include<bits/stdc++.h>
    using namespace std;
    #define cs const
    #define pb push_back
    #define pii pair<int,int>
    #define fi first
    #define se second
    #define ll long long
    cs int RLEN=1<<20|1;
    inline char gc(){
    	static char ibuf[RLEN],*ib,*ob;
    	(ib==ob)&&(ob=(ib=ibuf)+fread(ibuf,1,RLEN,stdin));
    	return (ib==ob)?EOF:*ib++;
    }
    inline int read(){
    	char ch=gc();
    	int res=0;bool f=1;
    	while(!isdigit(ch))f^=ch=='-',ch=gc();
    	while(isdigit(ch))res=(res+(res<<2)<<1)+(ch^48),ch=gc();
    	return f?res:-res;
    }
    inline ll readl(){
    	char ch=gc();
    	ll res=0;bool f=1;
    	while(!isdigit(ch))f^=ch=='-',ch=gc();
    	while(isdigit(ch))res=(res+(res<<2)<<1)+(ch^48),ch=gc();
    	return f?res:-res;
    }
    cs int N=1000005,M=10005;
    int n,m,a[M],len;
    ll mt[M],c[N];
    int main(){
    	#ifdef Stargazer
    	freopen("lx.cpp","r",stdin);
    	#endif
    	n=read(),generate(a+1,a+n+1,read);
    	cout<<n<<'
    ';
    	for(int i=1;i<=n;i++)cout<<a[i]<<" ";puts("");
    	m=read(),generate(c,c+m,readl);
    	mt[0]=1;
    	for(int i=1;i<=n&&mt[len]<=m;i++)if(a[i]!=1)mt[len+1]=mt[len]*a[i],len++;
    	mt[len+1]=1e18,len++;
    	for(int i=0;i<len;i++)
    	for(int j=m-1;~j;j--)
    	if(j%mt[i+1]/mt[i]>0)c[j]-=c[j-mt[i]];
    	cout<<m<<'
    ';
    	for(int i=0;i<m;i++)cout<<c[i]<<" ";
    }
    
    
  • 相关阅读:
    文件操作回顾
    数据类型回顾
    面向对象三大特性之封装与多态
    面向对象之继承
    轮播图
    jQuery事件操作
    jQuery动画效果
    jQuery篇
    文档对象模型
    javascript
  • 原文地址:https://www.cnblogs.com/stargazer-cyk/p/12328353.html
Copyright © 2020-2023  润新知