2
29
2016
0

[坑]数位相关练习

开坑了!没怎么做过这类数位的题,总之不能因为我不熟练就不做,坑连着开真爽

由于找题能力有限,找不到太多这样的题,所以就挖小点的坑吧

现在几道:   2/4


bzoj3679 发现可能的乘起来的数不多,于是直接拿下标DP就行了

#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
#define ll long long
#define nc() getchar()
inline ll read(){
	ll x=0;char ch=nc();for(;ch<'0'||ch>'9';ch=nc());
	for(;ch<='9'&&ch>='0';x=x*10+ch-48,ch=nc());return x;
}
int cnt,i,k,m,j,n,x,y,z;ll o,l,r,f[100100],d[20][10010],s[20][10010];
#define up(k) upper_bound(f+1,f+cnt+1,k)
inline ll work(ll x){
	ll ret=0,y=x;int len=0,n=::n;
	while(y)++len,y/=10;
	for(i=1;i<len;++i)ret+=s[i][up(n)-f-1];
	while(len){
		int now=x/pow(10,len-1);
		for(int i=1;i<now;++i)if(n>=i)if(len>1)ret+=s[len-1][up(n/i)-f-1];else ++ret;
		if(now)n/=now;else break;x%=(ll)pow(10,len-1),--len;
	}
	return ret;
}
int main(){
	for(n=read(),l=read(),r=read(),i=0;i<=32;++i)for(j=0;j<=19;++j)for(k=0;k<=16;++k)for(z=0;z<=11;++z){
		o=1ll*pow(2,i)*pow(3,j)*pow(5,k)*pow(7,z);
		if(o<=n&&o>0)f[++cnt]=o;
	}
	for(sort(f+1,f+cnt+1),s[1][0]=0,i=1;i<=9;++i)d[1][i]=1;
	for(j=1;j<=cnt;++j)s[1][j]=s[1][j-1]+d[1][j];
	for(i=2;i<=18;++i){
		for(j=1;j<=up(pow(10,i))-f-1;++j)for(k=1;k<=9;++k)if(f[j]%k==0)d[i][j]+=d[i-1][lower_bound(f+1,f+cnt+1,f[j]/k)-f];
		for(s[i][0]=0,j=1;j<=cnt;++j)s[i][j]=s[i][j-1]+d[i][j];
	}
	printf("%lld\n",work(r)-work(l));
}

bzoj3329 _(:зゝ∠)_我刚开始不会做,看了$Claris$的题解发现很傻_(:зゝ∠)_,题傻,我更傻

#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define nc() getchar()
#define ll long long
inline ll read(){
	ll x=0;char ch=nc();for(;ch<'0'||ch>'9';ch=nc());
	for(;ch<='9'&&ch>='0';x=x*10+ch-48,ch=nc());return x;
}
#define mo 1000000007
ll i,j,k,m,n,x,y,f[77][2][2],T,cnt,a[77];
struct Mat{
	ll a[2][2];Mat(){a[0][1]=a[0][0]=a[1][0]=a[1][1]=0;}
	Mat operator *(const Mat&b){
		Mat ret;
		for(int i=0,j,k;i<=1;++i)
			for(j=0;j<=1;++j)for(k=0;k<=1;++k)(ret.a[i][j]+=a[i][k]*b.a[k][j])%=mo;
		return ret;
	}
}A,B,C;
int main(){
	for(T=read();T--;){
		for(y=x=read(),cnt=0;y;a[++cnt]=y&1ll,y>>=1ll);
		for(i=1,j=cnt;i<=cnt&&i<j;++i,--j)swap(a[i],a[j]);
		for(memset(f,0,sizeof f),i=0;i<=1;++i)f[1][i][i==a[1]]=1;
		for(i=1;i<cnt;++i){
			if(f[i][0][0])for(j=0;j<=1;++j)f[i+1][j][0]+=f[i][0][0];
			if(f[i][1][0])f[i+1][0][0]+=f[i][1][0];
			if(f[i][0][1])for(j=0;j<=a[i+1];++j)f[i+1][j][j==a[i+1]]+=f[i][0][1];
			if(f[i][1][1])f[i+1][0][0==a[i+1]]+=f[i][1][1];
		}
		printf("%lld\n",f[cnt][0][0]+f[cnt][1][0]+f[cnt][0][1]+f[cnt][1][1]-1);
		for(A=B=C=Mat(),A.a[0][1]=A.a[1][0]=A.a[1][1]=B.a[0][0]=C.a[0][0]=C.a[1][1]=1,B.a[1][0]=2;x;x>>=1ll,A=A*A)if(x&1ll)C=C*A;
		C=C*B,printf("%lld\n",C.a[0][0]);
	}
}

 

updating...

Category: 日常 | Tags: | Read Count: 823

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

Host by is-Programmer.com | Power by Chito 1.3.3 beta | Theme: Aeros 2.0 by TheBuckmaker.com