标签:neu bottom 电量 top while efi 递增 考试 return
求组合数取模
复习了一下取模质数是阶乘逆元的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;
}
统计两个数组:
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; }
随着用电量的增加,电费单调递增
既然有了单调性,那么二分就好了
代码:
#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; }
标签:neu bottom 电量 top while efi 递增 考试 return
原文地址:http://www.cnblogs.com/zj75211/p/7624024.html