当前位置: 代码迷 >> 综合 >> CCPC-Wannafly Winter Camp Day3 (Div2)
  详细解决方案

CCPC-Wannafly Winter Camp Day3 (Div2)

热度:10   发布时间:2023-12-26 09:47:45.0

目录

A 二十四点*

F 小清新数论*

G 排列


 A 二十四点*

【分析】手动打表。测试点就两个,也就是只需要算n=10的时候有多少就可以了。n=10,最多也就1024-1种。

不是“好的序列”:1张牌有10个,2张牌有 43 个, 3张牌有74个,4 张牌5个。后面的肯定会有的,因为不是每张牌都要用到

1024减去这些~  答案出来了...

( 做题时手动打表,但是觉得太多了没继续... 〒▽〒

【代码】

#include<cstdio>
#include<iostream> 
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;int  main()
{int n,a[20];while(~scanf("%d",&n)){for(int i=1;i<=n;i++) scanf("%d",&a[i]);if(n==6) printf("32\n");else  printf("891\n");}
}

F 小清新数论*

【分析】队友代码...先贴

【代码】

#include<bits/stdc++.h>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define SI(i) scanf("%d",&i)
#define PI(i) printf("%d\n",i)
using namespace std;
typedef long long ll;
const int maxn=1e7+5;
const int INF=0x3f3f3f3f;
const double eps=1e-8;
int dir[9][2]={0,1,0,-1,1,0,-1,0, -1,-1,-1,1,1,-1,1,1};
template<class T>bool gmax(T &a,T b){return a<b?a=b,1:0;}
template<class T>bool gmin(T &a,T b){return a>b?a=b,1:0;}
ll gcd(ll a,ll b){ while(b) b^=a^=b^=a%=b; return a;}
ll inv(ll b,ll mod){return b==1?1:(mod-mod/b)*inv(mod%b,mod)%mod;}
ll ans;
ll fac[maxn]; //(a<=n,b<=m)范围内gcd=i的个数(筛选:i的倍数都应该减掉)
int mu[maxn];
const int mod=998244353;ll cnt,prime[maxn],vis[maxn],pp[maxn];
void get_mu(int n)
{memset(vis,0,sizeof(vis));memset(prime,0,sizeof(prime));memset(mu,0,sizeof(mu));cnt=0; mu[1]=1;vis[1]=1;pp[0]=0;pp[1]=1; for(ll i=2;i<=n;i++){//printf(",%d\n,",i);if(!vis[i]){prime[++cnt]=i;pp[i]=i-1; mu[i]=-1;}for(ll j=1;j<=cnt && prime[j]*i<=n;j++){vis[prime[j]*i]=1;if(i%prime[j]==0){mu[prime[j]*i]=0;pp[i*prime[j]]=pp[i]*prime[j]; break;}mu[prime[j]*i]=-mu[i];pp[i*prime[j]]=pp[i]*(prime[j]-1); }}for(int i=1;i<=n;i++)pp[i]+=pp[i-1];for(int i=1;i<=n;i++)fac[i]=2*pp[n/i]-1; 
}int main()
{int n,m,p,T;ans=0;scanf("%d",&n);get_mu(n);ll ans=0;for(int i=1;i<=n;i++){ans+=(mu[i]*fac[i]+mod)%mod;ans%=mod;}printf("%lld\n",ans);return 0;
}

G 排列

【代码】

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<queue>
#include<map>
using namespace std;const int maxn=1e5+5;
int p[maxn],q[maxn]; int main()
{int n;scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&q[i]); q[0]=0x3f3f3f3f; int idx=1;for(int i=1;i<=n;i++){if(q[i]<q[i-1])p[q[i]]=idx++;else continue; } for(int i=1;i<=n;i++)if(p[i]==0)p[i]=idx++; for(int i=1;i<=n;i++){if(i!=1)printf(" "); printf("%d",p[i]) ; } printf("\n"); 
} 

 

  相关解决方案