国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

2023第十四屆藍(lán)橋杯 C/C++大學(xué)生A組省賽 滿分題解

這篇具有很好參考價(jià)值的文章主要介紹了2023第十四屆藍(lán)橋杯 C/C++大學(xué)生A組省賽 滿分題解。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

寫在前面

以下代碼,目前均可通過(guò)民間OJ數(shù)據(jù)(dotcpp & New Online Judge),

兩個(gè)OJ題目互補(bǔ),能構(gòu)成全集,可以到對(duì)應(yīng)鏈接下搜題提交(感謝OJ對(duì)題目的支持)

如果發(fā)現(xiàn)任何問題,包含但不限于算法思路出錯(cuò)、OJ數(shù)據(jù)弱算法實(shí)際超時(shí)、存在沒考慮到的邊界情況等,請(qǐng)及時(shí)聯(lián)系作者

2023第十四屆藍(lán)橋杯 C/C++大學(xué)生A組省賽 滿分題解?

2023第十四屆藍(lán)橋杯 C/C++大學(xué)生A組省賽 滿分題解?

更新(2023年5月14日)

洛谷更新了藍(lán)橋杯2023年的題目,A組題號(hào)P9230-P9238

于是,把題目又都交了一遍,倒數(shù)第二題像素放置直接爆搜超時(shí),

60個(gè)點(diǎn)TLE了8個(gè)點(diǎn),加了個(gè)bitset記憶化就過(guò)了,代碼已更新

2023第十四屆藍(lán)橋杯 C/C++大學(xué)生A組省賽 滿分題解

題解

A.幸運(yùn)數(shù)(模擬)

題面

2023第十四屆藍(lán)橋杯 C/C++大學(xué)生A組省賽 滿分題解?

題解?

由于是填空題,按題意本地暴力,幾秒就跑出來(lái)結(jié)果了,直接交結(jié)果

代碼

#include<bits/stdc++.h>
using namespace std;
int ans;
int main(){
	/*
	for(int i=1;i<=100000000;++i){
		int cnt=0;
		for(int j=i;j;j/=10)cnt++;
		if(cnt&1)continue;
		int sum=0,now=0;
		for(int j=i;j;j/=10){
			now++;
			if(now<=cnt/2)sum+=j%10;
			else sum-=j%10;
		}
		if(!sum)ans++;
	}
	printf("%d\n",ans);
	*/
	puts("4430091");
	return 0;
}

B.有獎(jiǎng)問答(搜索/dp)

題面

2023第十四屆藍(lán)橋杯 C/C++大學(xué)生A組省賽 滿分題解?

題解

1. 搜索:2的30次方種可能,每次要么+10要么清零,遇到100分時(shí),直接return,幾秒跑出來(lái)結(jié)果后,直接交結(jié)果

2. dp:dp[i][j]表示前i輪過(guò)后分?jǐn)?shù)為j的方案數(shù),注意中間可以隨時(shí)停止

代碼(dp)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll dp[31][101],ans;
int main(){
	dp[0][0]=1;
	for(int i=0;i<30;++i){
		for(int j=0;j<100;j+=10){
			if(!dp[i][j])continue;
			if(j<90)dp[i+1][j+10]+=dp[i][j];
			dp[i+1][0]+=dp[i][j];
		}
		ans+=dp[i+1][70];
	}
	printf("%lld\n",ans);
	//puts("8335366");
	return 0;
}

C.平方差(構(gòu)造/規(guī)律)

題面

2023第十四屆藍(lán)橋杯 C/C++大學(xué)生A組省賽 滿分題解?

題解

打表或構(gòu)造發(fā)現(xiàn),形如4k+2的數(shù)無(wú)法被表示,

統(tǒng)計(jì)[l,r]的答案,前綴和作差,轉(zhuǎn)化為[1,r]的答案減去[1,l-1]的答案

而[1,x]中,形如4k+2的數(shù)的個(gè)數(shù)為(x+2)/4

證明的話,x=(y+z)(y-z),注意到y(tǒng)+z和y-z同奇偶,

1. y+z為奇數(shù)時(shí),x為奇數(shù);y+z為偶數(shù)時(shí),x為4的倍數(shù),這表明4k+2無(wú)法被取到

2.?2023第十四屆藍(lán)橋杯 C/C++大學(xué)生A組省賽 滿分題解?,2023第十四屆藍(lán)橋杯 C/C++大學(xué)生A組省賽 滿分題解?,這表明奇數(shù)和4的倍數(shù)均能被取到

代碼

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=500;
bool vis[N];
int l,r;
int cal(int x){
	return x-(x+2)/4;
}
int main(){
	/*
	for(int i=0;i<=50;++i){
		for(int j=0;j<=i;++j){
			int v=i*i-j*j;
			if(v>=0 && v<N)vis[v]=1;
		}
	}
	for(int i=0;i<=100;++i){
		if(!vis[i])printf("i:%d\n",i);
	}*/
	scanf("%d%d",&l,&r);
	printf("%d\n",cal(r)-cal(l-1));
	return 0;
}
//x=(y+z)(y-z)
//2k+1=(k+1)^2-k^2
//4k=(k+1)^2-(k-1)^2

D.更小的數(shù)(區(qū)間dp)

題面

2023第十四屆藍(lán)橋杯 C/C++大學(xué)生A組省賽 滿分題解?

2023第十四屆藍(lán)橋杯 C/C++大學(xué)生A組省賽 滿分題解?

題解

未反轉(zhuǎn)的段仍相同不用關(guān)注,只需關(guān)注反轉(zhuǎn)的段,

記反轉(zhuǎn)前的串為old(即num串),之后的串為new

運(yùn)用遞歸/記憶化搜索的思想,有以下幾種情況

1. 當(dāng)i=j時(shí),new[i,j]不小于old[i,j]

2. 當(dāng)i+1=j時(shí),new[i,j]小于old[i,j],當(dāng)且僅當(dāng)new[i]<old[i],即num[j]<num[i]

3. 否則,

①若num[j]<num[i],new[i,j]一定小于old[i,j]

②若num[j]=num[i],則可以去掉這兩個(gè)字母,只需比較new[i+1,j-1]和old[i+1,j-1]

③若num[j]>num[i],new[i,j]一定大于old[i,j]

從短串遞推到長(zhǎng)串,就是區(qū)間dp了,當(dāng)然直接寫記憶化搜索也行

代碼中,dp[i][j]=1表示反轉(zhuǎn)后更小,=0表示反轉(zhuǎn)后大于等于原來(lái)

代碼

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5e3+10;
int n,dp[N][N],ans;
char s[N];
int main(){
	scanf("%s",s);
	n=strlen(s);
	for(int len=2;len<=n;++len){
		for(int l=0;l+len-1<n;++l){
			int r=l+len-1;
			if(s[l]>s[r])dp[l][r]=1;
			else if(s[l]==s[r])dp[l][r]=dp[l+1][r-1];
			ans+=(dp[l][r]==1);
		}
	}
	printf("%d\n",ans);
	return 0;
}
//4321
//1234

E.更小的數(shù)(樹上莫隊(duì)/啟發(fā)式合并)

題面

2023第十四屆藍(lán)橋杯 C/C++大學(xué)生A組省賽 滿分題解?

題解

1. 樹上莫隊(duì):

樹上莫隊(duì)=莫隊(duì)+dfs序

建樹后求dfs序,每個(gè)子樹對(duì)應(yīng)的dfs區(qū)間就是一個(gè)詢問區(qū)間,將詢問區(qū)間排序后套用莫隊(duì),

維護(hù)當(dāng)前顏色i出現(xiàn)的次數(shù)now[i]、出現(xiàn)次數(shù)為i的顏色種類數(shù)freq[i]

任取區(qū)間內(nèi)出現(xiàn)的一種顏色x,若now[x]*freq[now[x]]=區(qū)間長(zhǎng)度則合法,否則不合法

復(fù)雜度O(nsqrt(n))

2. 啟發(fā)式合并:

可以維護(hù)相同的東西,只是套了個(gè)啟發(fā)式合并的殼

重兒子直接繼承當(dāng)前維護(hù)的信息,把輕兒子維護(hù)的信息往重兒子上合并,

由于每個(gè)點(diǎn)至多出現(xiàn)在log個(gè)輕兒子所在的子樹里,復(fù)雜度O(nlogn)

代碼(樹上莫隊(duì))

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+10;
int n,m,c[N],f,in[N],out[N],tot,id[N],pos[N],sz;
int now[N],freq[N],ans;
map<int,int>vis;
vector<int>e[N];
struct node{
	int l,r;
}q[N];
void add(int col,int v){
	freq[now[col]]--;
	now[col]+=v;
	freq[now[col]]++;
}
bool operator<(node a,node b){
	if(pos[a.l]==pos[b.l]){
		if(pos[a.l]&1)return a.r>b.r;
		else return a.r<b.r;
	}
	return a.l<b.l;
}
void dfs(int u){
	in[u]=++tot;
	id[tot]=u;
	for(auto &v:e[u]){
		dfs(v);
	}
	out[u]=tot;
	q[++m]={in[u],out[u]};
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;++i){
		scanf("%d%d",&c[i],&f);
		if(!vis.count(c[i])){
			vis[c[i]]=1;
			freq[0]++;
		}
		if(i>1)e[f].push_back(i);
	}
	dfs(1);
	sz=(int)sqrt(n);
	for(int i=1;i<=n;++i){
		pos[i]=1+(i-1)/sz;
	}
	sort(q+1,q+n+1);
	int l=1,r=1;
	add(c[1],1);
	for(int i=1;i<=n;++i){
		for(;r<q[i].r;r++)add(c[id[r+1]],1);
		for(;r>q[i].r;r--)add(c[id[r]],-1);
		for(;l<q[i].l;l++)add(c[id[l]],-1);
		for(;l>q[i].l;l--)add(c[id[l-1]],1);
		int col=c[id[l]],cnt=now[col],f=freq[cnt];
		if(f*cnt==r-l+1)ans++;
	}
	printf("%d\n",ans);
	return 0;
}
/*
6
2 0
2 1
1 2
3 3
3 4
1 4
*/

F.買瓜(折半枚舉+三進(jìn)制枚舉/枚舉子集的子集)

題面

2023第十四屆藍(lán)橋杯 C/C++大學(xué)生A組省賽 滿分題解?

題解

每個(gè)西瓜三種選擇:不選,選但不劈,選且劈兩半

直接三進(jìn)制枚舉的話,3的30次方,復(fù)雜度爆炸

考慮拆成兩半枚舉(折半枚舉,也叫meet-in-middle)

分別維護(hù)3的15次方大小的集合a、b,

答案只可能完全來(lái)自a、或者完全來(lái)自b、或者ab各一部分

ab各一部分的話,在枚舉b集合內(nèi)的元素對(duì)應(yīng)的和為x時(shí),到a集合內(nèi)查元素和m-x是否存在

復(fù)雜度O(3^15*log(3^15))?,大概3e8多,時(shí)間1s(題面pdf),比較極限,難以通過(guò)(New Online Judge2s dotcpp3s),試了試unordered_map去卡2s也TLE了,而瓶頸主要在集合查的這個(gè)log,

所以手寫哈希(開散列),將log這個(gè)常數(shù)再壓一壓,就可以通過(guò)2s的題了

256M空間其實(shí)也比較極限,哈希模數(shù)那個(gè)數(shù)組不要開太大(調(diào)小了TLE調(diào)大了MLE)

代碼

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> P;
#define fi first
#define se second
const int N=32,M=1<<15,mod=19260817,S=14348907;
int n,bit[M];
int head[mod],nex[S],cnt;
P b[S];
ll m,a[N],f[M],g[M],sum;
inline void upd(int x,int v){
    int u=x%mod;
    for(int i=head[u];i;i=nex[i]){
        if(b[i].fi==x){
            b[i].se=min(b[i].se,v);
            return;
        }
    }
    b[++cnt]=P(x,v);
    nex[cnt]=head[u];
    head[u]=cnt;
}
inline int cal(int x){
    int u=x%mod;
    for(int i=head[u];i;i=nex[i]){
        if(b[i].fi==x)return b[i].se;
    }
    return N;
}
int sol(){
    if(sum==m)return 0;
    if(n==1){
        if(a[0]/2==m)return 1;
        return -1;
    }
    int ans=N;
    for(int i=1;i<M;++i){
        bit[i]=bit[i>>1]+(i&1);
    }
    int l=n/2,lb=1<<l,r=n-n/2,rb=1<<r;
    for(int i=0;i<l;++i){
        f[1<<i]=a[i];
    }
    for(int i=1;i<lb;++i){
        int x=i&-i;
        f[i]=f[x]+f[i^x];
        if((f[i]>>1)>m)continue;
        for(int j=i;;j=(j-1)&i){
            ll v=(f[j]>>1)+f[j^i];
            if(v<=m){
                if(v==m)ans=min(ans,bit[j]);
                else upd((int)v,bit[j]);
            }
            if(!j)break;
        }
    }
    for(int i=0;i<r;++i){
        g[1<<i]=a[l+i];
    }
    for(int i=1;i<rb;++i){
        int x=i&-i;
        g[i]=g[x]+g[i^x];
        if((g[i]>>1)>m)continue;
        for(int j=i;;j=(j-1)&i){
            ll v=(g[j]>>1)+g[j^i];
            if(v<=m){
                if(v==m)ans=min(ans,bit[j]);
                else ans=min(ans,cal((int)(m-v))+bit[j]);
            }
            if(!j)break;
        }
    }
    if(ans>n)ans=-1;
    return ans;
}
int main(){
    scanf("%d%lld",&n,&m);
    m*=2;
    for(int i=0;i<n;++i){
        scanf("%lld",&a[i]);
        a[i]*=2;
        sum+=a[i];
    }
    printf("%d\n",sol());
    return 0;
}

G.網(wǎng)絡(luò)穩(wěn)定性(kruskal重構(gòu)樹)

題目2023第十四屆藍(lán)橋杯 C/C++大學(xué)生A組省賽 滿分題解?

2023第十四屆藍(lán)橋杯 C/C++大學(xué)生A組省賽 滿分題解?

題解

kruskal重構(gòu)樹裸題,

重構(gòu)樹聽上去高端,實(shí)則就是在kruskal建最大生成樹的過(guò)程中額外建點(diǎn)、賦權(quán)

比如,u和v當(dāng)前不在一個(gè)集合里,通過(guò)w這條邊合并時(shí),

新開一個(gè)點(diǎn)x,令x是u和v的父親,而x的權(quán)值為w,

查詢時(shí),查u和v的lca的權(quán)值即可,即為最大連通路徑上的最小連通權(quán)值

因?yàn)榘礄?quán)值從大到小遍歷,已經(jīng)通過(guò)權(quán)值大的邊,使得點(diǎn)之間盡可能連通了

代碼

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=4e5+10,M=3e5+10,K=20;
int n,m,q,u,v,par[N],a[N],f[N][K],dep[N];
bool vis[N];
vector<int>E[N];
struct edge{
	int u,v,w;
}e[M];
int find(int x){
	return par[x]==x?x:par[x]=find(par[x]);
}
bool cmp(edge a,edge b){
	return a.w>b.w;
}
void dfs(int u,int fa){
	vis[u]=1;
	f[u][0]=fa;
	dep[u]=dep[fa]+1;
	for(auto &v:E[u]){
		if(v==fa)continue;
		dfs(v,u);
	}
}
int lca(int u,int v){
	if(dep[u]<dep[v])swap(u,v);
	int d=dep[u]-dep[v];
	for(int i=K-1;i>=0;--i){
		if(d>>i&1)u=f[u][i];
	}
	if(u==v)return u;
	for(int i=K-1;i>=0;--i){
		if(f[u][i]!=f[v][i])u=f[u][i],v=f[v][i];
	}
	return f[u][0];
}
int main(){
	scanf("%d%d%d",&n,&m,&q);
	for(int i=1;i<=n+m;++i){
		par[i]=i;
	}
	for(int i=1;i<=m;++i){
		scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
	}
	sort(e+1,e+m+1,cmp);
	int cur=n;
	for(int i=1;i<=m;++i){
		int u=e[i].u,v=e[i].v,w=e[i].w;
		u=find(u),v=find(v);
		if(u==v)continue;
		++cur;
		par[u]=par[v]=cur;
		E[cur].push_back(u);
		E[cur].push_back(v);
		a[cur]=w;
	}
	for(int i=cur;i>=1;--i){
		if(!vis[i])dfs(i,0);
	}
	for(int j=1;j<K;++j){
		for(int i=1;i<=cur;++i){
			f[i][j]=f[f[i][j-1]][j-1];
		}
	}
	while(q--){
		scanf("%d%d",&u,&v);
		if(find(u)!=find(v)){
			puts("-1");
			continue;
		}
		printf("%d\n",a[lca(u,v)]);
	}
	return 0;
}
/*
5 4 3 
1 2 5
2 3 6
3 4 1
1 4 3
1 5
2 4
1 3
*/

H. 異或和之和(按位計(jì)算貢獻(xiàn))

題目

2023第十四屆藍(lán)橋杯 C/C++大學(xué)生A組省賽 滿分題解?

題解

按每個(gè)二進(jìn)制位i考慮,從而轉(zhuǎn)化為0、1序列的問題

一個(gè)子段[l,r]在第i位有貢獻(xiàn),當(dāng)且僅當(dāng)[l,r]內(nèi)第i位出現(xiàn)的次數(shù)為奇數(shù)次,

前綴和做差[l,r]=[1,r]減[1,l-1],所以維護(hù)當(dāng)前有多少個(gè)前綴是奇數(shù),有多少個(gè)前綴是偶數(shù)

[l,r]為奇數(shù),若[1,r]為偶數(shù)則要求[1,l-1]為奇數(shù),反之同理,

枚舉每個(gè)右端點(diǎn),統(tǒng)計(jì)與其對(duì)應(yīng)的有貢獻(xiàn)的左端點(diǎn),計(jì)算答案

代碼

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
int n,a[N],sum[2];
ll ans;
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;++i){
		scanf("%d",&a[i]);
	}
	for(int i=0;i<=20;++i){
		sum[0]=1,sum[1]=0;
		int now=0;
		ll all=0;
		for(int j=1;j<=n;++j){
			int v=a[j]>>i&1;
			now^=v;
			all+=sum[now^1];
			sum[now]++;
		}
		ans+=all*(1ll<<i);
	}
	printf("%lld\n",ans);
	return 0;
}
/*
5
1 2 3 4 5
*/

I. 像素放置(搜索)

題面

2023第十四屆藍(lán)橋杯 C/C++大學(xué)生A組省賽 滿分題解?

題解

寫狀壓的話感覺總難免需要關(guān)注三行的有效狀態(tài),

復(fù)雜度好像更沒有辦法保證,所以寫了搜索剪枝,

總體思路還是枚舉每一位填0還是填1,加入了校驗(yàn)機(jī)制,以及搜到解之后直接return

搜索剪枝也要用到插頭dp(輪廓線dp)的思想,配合記憶化

洛谷的數(shù)據(jù)足夠強(qiáng),沒加記憶化沒過(guò)

直接的想法是dp[10][10][1<<22]

dp[i][j][k]表示當(dāng)前搜到了(i,j)這個(gè)格子,而前面2m+2個(gè)格子的狀態(tài)是k時(shí),這個(gè)狀態(tài)是否搜到過(guò)

由于搜到解后就返回答案,這么記錄,只是為了避免重復(fù)搜無(wú)效的狀態(tài)

由于直接int數(shù)組開不下,所以用bitset將空間壓為1/32,bitset<M>dp[10][10]

2023第十四屆藍(lán)橋杯 C/C++大學(xué)生A組省賽 滿分題解

?如左圖,當(dāng)(i,j)位于行初時(shí),只需關(guān)注前2*m個(gè)格子;再往右一格時(shí),只需關(guān)注前2*m+1個(gè)格子,

再往右兩格及更右時(shí),只需關(guān)注前2*m+2個(gè)格子,直至行尾,最多只需關(guān)注22個(gè)格子

對(duì)于行越界的情形,不妨認(rèn)為上面有兩行全0的空行

復(fù)雜度2023第十四屆藍(lán)橋杯 C/C++大學(xué)生A組省賽 滿分題解

a[i][j]:原圖轉(zhuǎn)化過(guò)來(lái)的數(shù)字,下劃線轉(zhuǎn)成了INF

b[i][j]:當(dāng)前填的答案數(shù)組

cur[i][j]:(i,j)本身及(i,j)周圍一圈合法位置中,當(dāng)前填了幾個(gè)1

填一個(gè)數(shù)時(shí),考慮它本身及周圍一圈的合法位置(最多9個(gè))

校驗(yàn)機(jī)制是:

1. 如果當(dāng)前填了這個(gè)數(shù),導(dǎo)致超過(guò)上限,即cur[i][j]>a[i][j],則不合法

2. 如果當(dāng)前填的格子,是格子(i,j)管轄的最后一個(gè)格子,填完這個(gè)數(shù)后,a[i][j]和cur[i][j]不等,則也不合法

代碼

#include<bits/stdc++.h>
using namespace std;
const int S=15,N=10,M=1<<22,INF=0x3f3f3f3f;
int n,m,a[S][S],b[S][S],cur[S][S];
bitset<M>dp[N][N];
char s[S][S];
bool ok;
bool in(int x,int y){
	return 0<=x && x<n && 0<=y && y<m && a[x][y]!=INF;
}
bool can(int x,int y,int v){
	for(int i=-1;i<=1;++i){
		for(int j=-1;j<=1;++j){
			int nx=x+i,ny=y+j;
			if(in(nx,ny) && cur[nx][ny]+v>a[nx][ny])return 0;
		}
	}
	if(in(x-1,y-1) && cur[x-1][y-1]+v<a[x-1][y-1])return 0;
	if(x==n-1 && in(x,y-1) && cur[x][y-1]+v<a[x][y-1])return 0;
	if(y==m-1 && in(x-1,y) && cur[x-1][y]+v<a[x-1][y])return 0;
	return 1;
}
void dfs(int x,int y,int w){
	//cnt++;
	if(x==n && y==0){
		ok=1;
		for(int i=0;i<n;++i){
			for(int j=0;j<m;++j){
				printf("%d",b[i][j]);
			}
			puts("");
		}
		return;
	}
	if(ok)return;
	if(dp[x][y][w])return;
	dp[x][y][w]=1;
	for(int v=0;v<=1;++v){
		if(ok)return;
		if(can(x,y,v)){
			b[x][y]=v;
			if(v){
				for(int i=-1;i<=1;++i){
					for(int j=-1;j<=1;++j){
						int nx=x+i,ny=y+j;
						if(!in(nx,ny))continue;
						cur[nx][ny]++;
					}
				}
			}
			int nw=(w<<1)|v;
			if(y==m-1)dfs(x+1,0,nw&((1<<(2*m))-1));
			else dfs(x,y+1,nw&((1<<(2*m+2))-1));
			if(v){
				for(int i=-1;i<=1;++i){
					for(int j=-1;j<=1;++j){
						int nx=x+i,ny=y+j;
						if(!in(nx,ny))continue;
						cur[nx][ny]--;
					}
				}
			}
		}
	}
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=0;i<n;++i){
		scanf("%s",s[i]);
		for(int j=0;j<m;++j){
			a[i][j]=INF;
			if(s[i][j]!='_')a[i][j]=s[i][j]-'0';
		}
	}
	dfs(0,0,0);
	//printf("cnt:%d\n",cnt);
	return 0;
}

J.翻轉(zhuǎn)硬幣(整除分塊+杜教篩)

題面

2023第十四屆藍(lán)橋杯 C/C++大學(xué)生A組省賽 滿分題解?

2023第十四屆藍(lán)橋杯 C/C++大學(xué)生A組省賽 滿分題解?

題解

1. 5e6,可以考慮埃篩枚舉因數(shù),x需要翻當(dāng)且僅當(dāng)x的真因數(shù)翻了奇數(shù)次

2. 1e9,觀察5e6時(shí)的式子,其實(shí)就是莫比烏斯函數(shù)模2意義下的值,

即只有0和1兩種情況,此時(shí)可以認(rèn)為是或,然后直接套杜教篩

3. 1e18,觀察1e9時(shí)的式子或思考莫比烏斯函數(shù)的定義,

只有包含完全平方因子的數(shù)的值才為0,

所以,考慮對(duì)平方因子容斥,即為所求,

即:

當(dāng)然,化到這個(gè)式子的情況下,直接暴力也是可以通過(guò)1e9的數(shù)據(jù)的

然而,對(duì)于1e18,直接整除分塊(數(shù)論分塊)的話是?的,不能接受

于是,類似杜教篩預(yù)處理?前綴和的操作,

這里實(shí)際預(yù)處理?部分的答案(詢問是單組的,現(xiàn)算這部分效果是一樣的)

用杜教篩預(yù)處理的前綴和,后面[1e6,1e9]的部分用整除分塊配合的區(qū)間和解決

【SSL 2402】最簡(jiǎn)根式(杜教篩)(整除分塊)_SSL_TJH的博客-CSDN博客,與這個(gè)題類似

復(fù)雜度感覺是?的,但據(jù)uoj群友說(shuō)是?的,就不太懂了…

實(shí)際預(yù)處理到1e6交New Online Judge也是會(huì)TLE的,改到1e7才過(guò)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-426658.html

代碼

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e7+10;
bool ok[N];
int pr[N],mu[N],cnt,up;
map<int,int>smu;
ll n,ans[N];
void sieve(ll n){
    mu[1]=1;
    for(ll i=2;i<N;++i){
        if(!ok[i]){
            pr[cnt++]=i;
            mu[i]=-1;
        }
        for(int j=0;j<cnt;++j){
            ll k=i*pr[j];
            if(k>=N)break;
            ok[k]=1;
            if(i%pr[j]==0){
                mu[k]=0;
                break; 
            }
            mu[k]=-mu[i];
        }
    }
    for(int i=1;i<N;++i){
    	ans[i]=mu[i]*(n/i/i);
    }
    for(int i=2;i<N;++i){
        mu[i]+=mu[i-1];
        ans[i]+=ans[i-1];
    }
}
int djsmu(int n){
    if(n<N)return mu[n];
    if(smu.count(n))return smu[n];
    int ans=1;
    for(int l=2,r;l<=n;l=r+1){
        r=n/(n/l);
        ans=ans-(r-l+1)*djsmu(n/l);
        if(r==n)break;
    }
    return smu[n]=ans;
}
ll cal(ll n){
	int sq=sqrt(n);
	if(sq<N)return ans[sq];
	ll l=2;
	for(;l*l*l<=n;l++);
	ll res=ans[l-1];
	for(ll r;l*l<=n;l=r+1){
	    ll v=n/l/l;
		r=sqrt(n/v);
		res+=v*(djsmu(r)-djsmu(l-1));
	}
	return res;
}
int main(){
    scanf("%lld",&n);
    sieve(n);
    printf("%lld\n",cal(n));
    return 0;
} 

到了這里,關(guān)于2023第十四屆藍(lán)橋杯 C/C++大學(xué)生A組省賽 滿分題解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 第十四屆藍(lán)橋杯Python B組省賽復(fù)盤

    第十四屆藍(lán)橋杯Python B組省賽復(fù)盤

    【問題描述】(5 分) 請(qǐng)求出在 12345678 至 98765432 中,有多少個(gè)數(shù)中完全不包含 2023 。 完全不包含 2023 是指無(wú)論將這個(gè)數(shù)的哪些數(shù)位移除都不能得到 2023 。 例如 20322175,33220022 都完全不包含 2023,而 20230415,20193213 則 含有 2023 (后者取第 1, 2, 6, 8 個(gè)數(shù)位) 。 【思路】 正則表達(dá)

    2024年02月02日
    瀏覽(20)
  • 2023第十四屆藍(lán)橋杯國(guó)賽 C/C++ 大學(xué) B 組

    試題 F: 刪邊問題 沒實(shí)現(xiàn) 試題 I: 拼數(shù)字 不會(huì)做 試題 J: 逃跑 不會(huì)做 本題總分:5 分 【問題描述】 小藍(lán)在黑板上連續(xù)寫下從 1 到 2023 之間所有的整數(shù),得到了一個(gè)數(shù)字序列: S = 12345678910111213 . . . 20222023。 小藍(lán)想知道 S 中有多少種子序列恰好等于 2023? 提示,以下是 3 種滿足

    2024年02月08日
    瀏覽(39)
  • 2023第十四屆藍(lán)橋杯國(guó)賽 C/C++ 大學(xué) B 組 (賽后記錄)

    2023 第十四屆藍(lán)橋杯國(guó)賽 C / C + + 大學(xué) B 組 2023第十四屆藍(lán)橋杯國(guó)賽 C/C++ 大學(xué) B 組 2023 第十四屆藍(lán)橋杯國(guó)賽 C / C + + 大學(xué) B 組 點(diǎn)我查看題目PDF 由于是學(xué)校期末復(fù)習(xí)周, 很多算法沒有復(fù)習(xí), 結(jié)果考了一堆板題 (悲 A題 子 2023 直接跑暴力就行, 應(yīng)該沒啥問題 答案 B題 雙子數(shù) 篩一下可

    2024年02月09日
    瀏覽(21)
  • 第十四屆藍(lán)橋杯大賽軟件賽決賽 C/C++ 大學(xué) B 組 試題 A: 子 2023

    第十四屆藍(lán)橋杯大賽軟件賽決賽 C/C++ 大學(xué) B 組 試題 A: 子 2023

    小藍(lán)在黑板上連續(xù)寫下從 1 1 1 到 2023 2023 2023 之間所有的整數(shù),得到了一個(gè)數(shù)字序列: S = 12345678910111213 ? 20222023 S = 12345678910111213cdots 20222023 S = 12345678910111213 ? 20222023 小藍(lán)想知道 S S S 中有多少種子序列恰好等于 2023 2023 2023 ? 提示,以下是 3 3 3 種滿足條件的子序列(用中括

    2024年02月07日
    瀏覽(47)
  • 2023年第十四屆藍(lán)橋杯大賽python組省賽真題(已更新完)

    本篇更新藍(lán)橋杯省賽真題的后5道。 6.試題 F: 公因數(shù)匹配 時(shí)間限制: 10.0s 內(nèi)存限制: 512.0MB 本題總分:15 分 【問題描述】 給定 n 個(gè)正整數(shù) Ai,請(qǐng)找出兩個(gè)數(shù) i, j 使得 i j 且 Ai 和 Aj 存在大于 1 的 公因數(shù)。 如果存在多組 i, j,請(qǐng)輸出 i 最小的那組。如果仍然存在多組 i, j,請(qǐng)輸出

    2024年02月06日
    瀏覽(34)
  • 記2023第十四屆藍(lán)橋杯感受

    記2023第十四屆藍(lán)橋杯感受

    弱校ACM隊(duì)員,曾獲CB國(guó)二,CG國(guó)優(yōu)第六。(我是fw) ------------------------------------------------------------------------分割線 2023.04.09 今年再次參加CG組,估計(jì)g了,盲猜一波省二前排,出成績(jī)后再來(lái)更新。 ------------------------------------------------------------------------分割線 先說(shuō)一下今年感受,

    2023年04月10日
    瀏覽(21)
  • 2023第十四屆藍(lán)橋杯JavaB組

    2023第十四屆藍(lán)橋杯JavaB組

    目錄 A、階乘求和 ?Ⅰ、題目解讀 Ⅱ、代碼? B、幸運(yùn)數(shù)字 ?Ⅰ、題目解讀 ?Ⅱ、代碼 C: 數(shù)組分割(時(shí)間限制: 1.0s 內(nèi)存限制: 512.0MB) ?Ⅰ、解題思路 ?Ⅱ、代碼 ?D、矩形總面積(時(shí)間限制: 1.0s 內(nèi)存限制: 512.0MB) ?Ⅰ、題目解讀 Ⅱ、代碼? ?E、蝸牛(時(shí)間限制: 1.0s 內(nèi)存限制

    2023年04月09日
    瀏覽(28)
  • 第十四屆藍(lán)橋杯大賽軟件賽省賽(Python大學(xué)A組)

    第十四屆藍(lán)橋杯大賽軟件賽省賽(Python大學(xué)A組)

    2023年藍(lán)橋杯 ?? 省賽真題 Python大學(xué)A組 ? ? ? ??試題A:特殊日期 ????????試題B:分糖果 ????????試題C:三國(guó)游戲 ????????試題D:平均 ????????試題E:翻轉(zhuǎn) ? ? ? ??試題F:子矩陣 ????????試題G:階乘的和 ????????試題H:奇怪的數(shù) ????????試題

    2024年02月04日
    瀏覽(57)
  • 第十四屆藍(lán)橋杯省賽c/c++大學(xué)B組題解

    第十四屆藍(lán)橋杯省賽c/c++大學(xué)B組題解

    個(gè)人答案,有錯(cuò)漏感謝指正哈 本題總分:5 分 【問題描述】 ??小藍(lán)現(xiàn)在有一個(gè)長(zhǎng)度為 100 的數(shù)組,數(shù)組中的每個(gè)元素的值都在 0 到 9 的范圍之內(nèi)。數(shù)組中的元素從左至右如下所示: 5 6 8 6 9 1 6 1 2 4 9 1 9 8 2 3 6 4 7 7 5 9 5 0 3 8 7 5 8 1 5 8 6 1 8 3 0 3 7 9 2 7 0 5 8 8 5 7 0 9 9 1 9 4 4 6 8 6 3

    2023年04月12日
    瀏覽(23)
  • 第十四屆藍(lán)橋杯大賽軟件賽省賽(Java 大學(xué)B組)

    第十四屆藍(lán)橋杯大賽軟件賽省賽(Java 大學(xué)B組)

    別問為什么不用 Java 寫, Java簡(jiǎn)直依托答辯 。 感覺 Java 組難度有點(diǎn)大 ??令 S = 1 ! + 2 ! + 3 ! + . . . + 202320232023 ! S = 1! + 2! + 3! + ... + 202320232023! S = 1 ! + 2 ! + 3 ! + ... + 202320232023 ! ,求 S S S 的末尾 9 9 9 位數(shù)字。 ??提示:答案首位不為 0 0 0 。 ??階乘增加很快, 45 ! 45! 45 ! 的末

    2024年02月03日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包