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);
}

浙公网安备 33010602011771号