首页 > 其他分享 >Project Euler 588 题解

Project Euler 588 题解

时间:2024-10-16 12:43:53浏览次数:1  
标签:int 题解 long Project maxn 588 Euler

这玩意好像甚至有递推式……不太懂

image

(为什么是图片?cnblogs 第一个公式没渲染成功)

时间复杂度是 \(O(4^{\deg F}\log K)\) 的。

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=100;
int f[17][maxn],cur[10],al[4];
int calc(int K){
	// cerr<<"___________________________________"<<endl;
	// cerr<<"solve "<<K<<endl;
	memset(f,0,sizeof(f));
	f[1][1]=1;
	for(int R=2;R<=62;R++){
		if(K&(1ll<<R-2)){
			for(int j=0;j<4;j++)al[j]=0;
			for(int j=0;j<16;j++)al[0]+=(j&1)*(1<<j);
			for(int j=0;j<16;j++)al[1]+=(__builtin_popcount(j)&1)*(1<<j);
			for(int j=0;j<16;j++)al[2]+=(((j&1)+((j>>1)&1)+((j>>2)&1))&1)*(1<<j);
			for(int j=0;j<16;j++)al[3]+=((((j>>1)&1)+((j>>3)&1))&1)*(1<<j);
			for(int j=1;j<16;j++){
				int c1=(1<<16)-1,c2=0;
				for(int k=0;k<4;k++){
					if(j&(1<<k))c1=c1&al[k];
					else c2=c2|al[k];
				}
				int x=c1-(c1&c2);
				for(int l=0;l<16;l++)if((1<<l)&x)f[j][R]+=f[l][R-1];
			}
			for(int j=0;j<4;j++)al[j]=0;
			for(int j=0;j<16;j++)al[0]+=(((j&1)+((j>>2)&1))&1)*(1<<j);
			for(int j=0;j<16;j++)al[1]+=((((j>>1)&1)+((j>>2)&1)+((j>>3)&1))&1)*(1<<j);
			for(int j=0;j<16;j++)al[2]+=(__builtin_popcount(j)&1)*(1<<j);
			for(int j=0;j<16;j++)al[3]+=((j>>3)&1)*(1<<j);
			for(int j=1;j<16;j++){
				int c1=(1<<16)-1,c2=0;
				for(int k=0;k<4;k++){
					if(j&(1<<k))c1=c1&al[k];
					else c2=c2|al[k];
				}
				int x=c1-(c1&c2);
				for(int l=0;l<16;l++)if((1<<l)&x)f[j][R]+=f[l][R-1];
			}
		}else{
			for(int j=0;j<4;j++)al[j]=0;
			for(int j=0;j<16;j++)al[0]+=(j&1)*(1<<j);
			for(int j=0;j<16;j++)al[2]+=((j>>1)&1)*(1<<j);
			for(int j=1;j<16;j++){
				int c1=(1<<16)-1,c2=0;
				for(int k=0;k<4;k++){
					if(j&(1<<k))c1=c1&al[k];
					else c2=c2|al[k];
				}
				int x=c1-(c1&c2);
				for(int l=0;l<16;l++)if((1<<l)&x)f[j][R]+=f[l][R-1];
			}
			for(int j=0;j<4;j++)al[j]=0;
			for(int j=0;j<16;j++)al[0]+=((j>>2)&1)*(1<<j);
			for(int j=0;j<16;j++)al[2]+=((j>>3)&1)*(1<<j);
			for(int j=1;j<16;j++){
				int c1=(1<<16)-1,c2=0;
				for(int k=0;k<4;k++){
					if(j&(1<<k))c1=c1&al[k];
					else c2=c2|al[k];
				}
				int x=c1-(c1&c2);
				for(int l=0;l<16;l++)if((1<<l)&x)f[j][R]+=f[l][R-1];
			}
		}
		// for(int j=0;j<16;j++)cerr<<f[j][R]<<" ";cerr<<endl;
	}
	int ans=0;
	for(int i=0;i<16;i++)ans+=f[i][62]*__builtin_popcount(i);
	// cerr<<K<<" ans = "<<ans<<endl;
	return ans;
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	// cout<<calc(100)<<endl;
	int K,res=0;cin>>K;
	for(int i=1,z=1;i<=K;i++)z=z*10,res+=calc(z);
	cout<<res<<endl;
	return 0;
}

标签:int,题解,long,Project,maxn,588,Euler
From: https://www.cnblogs.com/british-union/p/18469652

相关文章

  • 题解:[SNCPC2019] Pick Up
    ProblemLink[SNCPC2019]PickUp题意给出甲的坐标和速度,乙的坐标和速度,商场的坐标,可以让乙去接甲,求甲前往商场的最短用时。Solution分类讨论。思考乙是否要去接甲。这个很简单,令\(ans1\)为甲自己出发耗时,\(ans2\)为乙接甲耗时,两者取最小值即可。\(ans1\)很好算,那么\(......
  • P3794 签到题IV 题解
    题目传送门前置知识最大公约数解法\(\gcd\)和\(\operatorname{or}\)在固定左端点的情况下至多会变化\(O(\logV)\)次。以\(\gcd\)为例,考虑求出所有的四元组\((l,r,x,val)\)表示\(\foralli\in[l,r],\gcd\limits_{j=i}^{x}\{a_{j}\}=val\)。本题中因为\(x\)......
  • CF1458D Flip and Reverse 题解
    思路由于它要求\(\text{01}\)数量相等,我们可以考虑站在前缀和的角度看待这个问题。我们将\(0\)看作负一,\(1\)看作一。可以把它化成一个折线图(方便观察)。观察一下它的操作实际上在干什么。容易发现,在折线图上,我们把操作的\([l,r]\)的整段折线reverse了一遍。同样的,......
  • Project ‘org.springframework.boot:spring-boot-starter-parent:2.7.7’ not found
    原文链接:Project‘org.springframework.boot:spring-boot-starter-parent:2.7.7’notfound–每天进步一点点(longkui.site)某日构建springboot项目,构建完毕以后发现下面这样然后打开pom文件,发现springboot的依赖爆红(这个版本号是随便举例)我去本地仓库看了看,有这个依赖,......
  • [题解]CF1136E Nastya Hasn't Written a Legend
    思路首先考虑操作1一个点\(i\)能被操作到的条件。注意到此时\(x\simi-1\)这些位置都是被更新过的,再仔细观察此时\(\forallj\in[x,i),a_j=a_x+\sum_{p=x}^{j-1}k_p\)。那么对于\(a_i\)如果会被修改将会变为\(a_x+\sum_{p=x}^{i-1}k_p\),那么\(a_i......
  • [ABC213G] Connectivity 2 题解
    T3[ABC213G]Connectivity2题意:给定一张无向图\(G\),将其删去\(0\) 条及以上的边构成一张新图,求对于所有点\(k\in(1,n]\),使\(k\) 与\(1\) 连通的新图的个数。比较套路的一道状压DP。尽管刚开始思考毫无头绪。Step1.令\(f_S\)表示点集为\(S\)的连通子图的个数,\(......
  • [TJOI2018] 游园会 题解
    T7[TJOI2018]游园会只能说是道有意思的好题。一般来说遇到这种题我们想到的都会是设\(f_{i,\dots}\)表示长度为\(i\),然后后面跟一堆状态的情况。此题需要我们满足两个条件:LCS的长度;不能出现\(\texttt{NOI}\)的子串。第二个限制我们可以通过状态设计来解决,但第一个......
  • [JSOI2018] 潜入行动 题解
    T6[JSOI2018]潜入行动很套路、很裸的一道树形DP。看了状态就会推方程的那种。设\(f_{u,i,0/1,0/1}\)表示以\(u\)为根的子树中有\(i\)个监听器、\(u\)有没有监听器、\(u\)有没有被监听的方案数。显然要枚举子节点\(v\)、\(u\)的监听器数量\(i\)、\(v\)的监听器数......
  • [ABC213G] Connectivity 2 题解
    [ABC213G]Connectivity2题解套路的经典图上计数题。考虑枚举和\(1\)相连的子集\(S\)。答案显然由两部分构成,\(S\)集合和\(1\)相连的方案数\(f(S)\)和\(S\)对于\(G\)的补集所有的方案数\(g(S)\)。答案就是二者相乘。显然\(g\)更好处理。直接枚举集合的边即可......
  • P8386 [PA2021] Od deski do desk 题解
    P8386[PA2021]Oddeskidodesk题解考虑一个大的序列一定被分成几个区间来删除。朴素的dp定义是\(dp_{i,j}\)表示前\(i\)个数,最后一个数元素是\(j\)的方案数。然而这样不仅不好转移,而且设不下状态。不难发现所有值是等价的。考虑这样一个事情:若我们要分出一个新的区......