目录
A 二十四点*
F 小清新数论*
G 排列
【分析】手动打表。测试点就两个,也就是只需要算n=10的时候有多少就可以了。n=10,最多也就1024-1种。
不是“好的序列”:1张牌有10个,2张牌有 43 个, 3张牌有74个,4 张牌5个。后面的肯定会有的,因为不是每张牌都要用到
1024减去这些~ 答案出来了...
( 做题时手动打表,但是觉得太多了没继续... 〒▽〒
【代码】
#include
#include
#include
#include
#include
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");
}
}
【分析】队友代码...先贴
【代码】
#include
#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};
templatebool gmax(T &a,T b){return abool 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;
}
【代码】
#include
#include
#include
#include
#include
#include
#include
#include