Loading

noip模拟75

A. 如何优雅的送分

\(Mobius\) 其实并不是简单地和 \(gcd(i,j)==1\) 这一类东西有关.

更应该去思考 ta 的本身的含义(感觉之前学的东西太浅薄了,只有在考试的时候才能挖掘出许多知识更多本质的东西).

\(Mobius\) 本身的定义就是根据因子的性质决定的,所以对于质因子的特殊求和,能不能想到 \(Mobius\) 是一个很关键的东西.

\(Mobius\) 函数的值建立在质因子的个数种类数.

我们考虑什么时候可以使用 \(Mobius\) 函数.

由于 \(Mobius\) 函数在质因子有重复的时候值为 \(0\),所以我们可以暂且不谈 ta 的含义.

剩下的 \(Mobius\) 函数要么是 \(1\) 要么是 \(-1\),奇正偶负 或者 奇负偶正 ..?

所以我们能否再结合容斥或二项式来理解..

这时候我们再考虑函数值为 \(0\) 的情况,其实可以理解为,种类数相同时就不算个数了.

所以可以把 \(Mobius\) 在 绝对值/偶数次方 意义下理解成不同因子的匹配方案..?

另外,\(Mobius\) 函数有很多现在看起来比较牛逼的式子:

比如:\(\mu^2(i)=\sum\limits_{k^2|i} \mu(k)\). 根据二项式定理来理解.

另外,把 \(2^{G(i)}\) 在组合数意义下看待可能会有新的发现.

A_code
#include<bits/stdc++.h>
using namespace std;
namespace BSS {
	#define ll long long int 
	#define ull unsigned ll
	#define lf double
	#define lbt(x) (x&(-x))
	#define mp(x,y) make_pair(x,y)
	#define lb lower_bound 
	#define ub upper_bound
	#define Fill(x,y) memset(x,y,sizeof x)
	#define Copy(x,y) memcpy(x,y,sizeof x)
	#define File(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout)
	inline ll read() {
		ll w=0; bool cit=1; char ch;
		while(!isdigit(ch=getchar())) if(ch=='-') cit=0; 
		while(isdigit(ch)) w=(w<<3)+(w<<1)+(ch^48),ch=getchar();
		return cit?w:-w;
	}
} using namespace BSS;

const ll mod=1e9+7,N=1e6+21;

ll m,n,cnt,ans;
ll miu[N],vis[N],pri[N];
auto getsum=[](ll x)->ll{
	ll res=0;
	for(ll l=1,r;l<=x;l=r+1)
		r=x/(x/l),res=(res+(x/l)%mod*(r-l+1)%mod)%mod;
	return res;
};
signed main(){
	File(elegant);
	n=read(),ans=getsum(n),m=sqrt(n);
	for(ll i=2;i<=m;i++){
		if(!vis[i]) pri[++cnt]=i,miu[i]=-1;	
		vis[i]=1,ans=(ans+mod+miu[i]*getsum(n/(i*i))%mod)%mod;
		for(ll j=1;j<=cnt and pri[j]*i<=m;j++){
			vis[pri[j]*i]=1;
			if(i%pri[j]==0) { miu[i*pri[j]]=0; break; }
			miu[pri[j]*i]=-miu[i];
		}
	}	
	printf("%lld\n",ans),exit(0);
}

B. 阴阳

可持久化,先鸽.

C. 你猜是不是找规律

拉格朗日,先鸽.

D. 小说

退背包板子题.

D_code
#include<bits/stdc++.h>
using namespace std;
namespace BSS {
	#define ll long long int 
	#define ull unsigned ll
	#define lf double
	#define lbt(x) (x&(-x))
	#define mp(x,y) make_pair(x,y)
	#define lb lower_bound 
	#define ub upper_bound
	#define Fill(x,y) memset(x,y,sizeof x)
	#define Copy(x,y) memcpy(x,y,sizeof x)
	#define File(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout)
	inline ll read() {
		ll w=0; bool cit=1; char ch;
		while(!isdigit(ch=getchar())) if(ch=='-') cit=0; 
		while(isdigit(ch)) w=(w<<3)+(w<<1)+(ch^48),ch=getchar();
		return cit?w:-w;
	}
} using namespace BSS;

const ll N=705,W=7005,mod=1e9+7;

ll m,n,sum,ansid;
ll val[N],bag[N],num[N],vs[N*W],dp[N*W];
signed main(){
	File(novel);
	n=read(),dp[0]=1,num[0]=0; ll cnt=0;
	for(ll i=1;i<=n;i++) val[i]=read(),sum+=val[i];
	sort(val+1,val+1+n);
	for(ll i=1;i<=n;i++){
		for(ll j=sum-val[i];j>=0;j--) dp[j+val[i]]=(dp[j+val[i]]+dp[j])%mod;
	}
	for(ll i=1;i<=n;i++){
		for(ll j=0;j<=sum-val[i];j++) dp[j+val[i]]=(dp[j+val[i]]-dp[j]+mod)%mod;
		for(ll j=0;j<=sum;j++) num[i]+=(dp[j]>0);
		for(ll j=sum-val[i];j>=0;j--) dp[j+val[i]]=(dp[j+val[i]]+dp[j])%mod;
		if(num[i]>num[ansid]) ansid=i;
	}
	printf("%lld ",val[ansid]);
	for(ll i=1;i<=n;i++){
		if(i==ansid) continue;
		bag[++cnt]=val[i],bag[++cnt]=-val[i];
	}
	vs[sum]=1;
	for(ll i=1;i<=cnt;i++){
		if(bag[i]>0){
			for(ll j=sum-bag[i];j>=-sum;j--)
				if(vs[j+sum]) vs[j+bag[i]+sum]=1;
		}
		else{
			for(ll j=-sum-bag[i];j<=sum;j++){
				if(vs[j+sum]) vs[j+bag[i]+sum]=1;
			}
		}
	}
	for(ll i=1;i<=sum;i++) 
		if(!vs[i+sum]) printf("%lld\n",i),exit(0);
	exit(0);
}
posted @ 2021-10-13 07:25  AaMuXiiiiii  阅读(66)  评论(0)    收藏  举报