17.10.03
- 上午
- 模擬考試
- Prob.1(AC)轉化為求最多的不重疊的線段(帶權)。也真是巧了,前天大米兔才分享過這個題,只是背景故事不同……
- Prob.2(WA)神題,好像是概率DP,沒人做出來,網上還沒題解,只有一個光禿禿的STD,看不懂。
- Prob.3(WA)一個找規律的題,我都做出來了。
但絕望的錯完了,本來以為可以AC呢。
然後發現數據後發現,沒註意樣例輸出的我多輸出了1mol的空格……
刪除代碼裏的空格輸出後,就AC了……
(怎麽能如此粗心!)
- 下午
- 入門OJ
- 入門OJ 2054: [Noip模擬題]數列計數
求組合數取模
復習了一下取模質數是階乘逆元的O(n)遞推求法,
可用於O(1)求組合數
代碼#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int mod=2000003;
int fac[2000005],inv[2000005];
int power(int a,int b)
{
int val=1;
while(b)
{
if(b&1) val=(1ll*val*a)%mod;
a=(1ll*a*a)%mod; b>>=1;
}
return val;
}
void pre_fac_inv(int n)
{
fac[0]=fac[1]=1;
for(int i=2;i<=n;i++) fac[i]=(1ll*fac[i-1]*i)%mod;
inv[n]=power(fac[n],mod-2);
for(int i=n;i>1;i--) inv[i-1]=(1ll*inv[i]*i)%mod;
inv[0]=inv[1];
}
int c(int m,int n)
{
return 1ll*fac[m]*inv[m-n]%mod*inv[n]%mod;
}
int main(){
int n;
scanf("%d",&n);
pre_fac_inv(2*n);
int ans=(c(2*n-1,n-1)-n+mod)%mod;
printf("%d",(ans*2+n)%mod);
return 0;
}
- 入門OJ 2055: [Noip模擬題]堆蛋糕
統計兩個數組:
v[k]表示同類小於等於k的蛋糕的總數量
w[k]表示同類大於等於k的蛋糕有多少種
那麽對於一個k是否可成為答案(即可否分成k組),只需滿足:
v[k]+w[k]*3>=3*k
代碼
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int w[3000005],v[3000005]; int cnt[3000005],n,r; int main(){ scanf("%d",&n); for(int i=1,a;i<=n;i++) scanf("%d",&a),cnt[a]++,r=max(r,a); for(int i=1;i<=r;i++) w[cnt[i]]++,v[cnt[i]]+=cnt[i]; for(int i=1;i<=n;i++) v[i]+=v[i-1]; for(int i=n;i>=1;i--) w[i]+=w[i+1]; for(int k=n/3;k>=1;k--){ if(v[k-1]+w[k]*k>=3*k){ printf("%d",k); break; } } return 0; }
- 入門OJ 2059: [Noip模擬題]電費結算
隨著用電量的增加,電費單調遞增
既然有了單調性,那麽二分就好了
代碼:
#include<cstdio> #include<cstring> #include<iostream> #define ll long long using namespace std; ll allfi,allused,derfi,oneused; ll cal(ll used){ ll fi=0; if(used<=100) fi+=2*(used-0); else{ fi+=2*(100-0); if(used<=10000) fi+=3*(used-100); else{ fi+=3*(10000-100); if(used<=1000000) fi+=5*(used-10000); else{ fi+=5*(1000000-10000); fi+=7*(used-1000000); } } } return fi; } ll binary_search(){ ll l=1,r=1000000000,mid,ans; while(l<=r){ mid=(l+r)>>1; if(cal(mid)<=allfi) ans=mid,l=mid+1; else r=mid-1; } return ans; } ll binary_sssssssssearch(){ ll l=1,r=allused/2,mid,ans; while(l<=r){ mid=(l+r)>>1; if(cal(mid)+derfi<=cal(allused-mid)) ans=mid,l=mid+1; else r=mid-1; } return ans; } int main(){ scanf("%lld%lld",&allfi,&derfi); allused=binary_search(); oneused=binary_sssssssssearch(); printf("%lld",cal(oneused)); return 0; }
- 晚上
- End
17.10.03