您的位置:首页 > 其它

Codeforce#181 div2 C,E--problem 300E,300C

2013-04-26 04:06 267 查看
E:很值得学习的方法,阶乘很大时结果不能存下,

用此方法统计质因数的个数来表示

又偷了别人的代码

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <vector>
using namespace std;
#define ll long long
#define MAX 10000005
int a[MAX],isp[MAX];
ll cnt[MAX];

int main ()
{
int k;
scanf("%d",&k);
int tt,low=MAX,high=0;
ll rr=0;
for(int i=0;i<k;++i)
{
scanf("%d",&tt);
a[tt]++;
rr+=tt;
low=min(low,tt);
high=max(high,tt);
}
for(int i=1;i<MAX;++i)
a[i]+=a[i-1];
ll ans=1;
for(int i=2;i<MAX;++i)
if(!isp[i])
{
for(int j=i;j<MAX;j+=i) // 含有质数i的数都筛除
isp[j]=1;

ll cnt=0;
for(ll j=i ; j<MAX ; j*=i)
for(ll x=j; x<MAX; x+=j)
cnt+= k-a[x-1]; // 统计k个数的阶乘含质因数i多少个

ll left=0,right=rr;
while(left<right)
{
ll mid=(left+right)/2;
ll cnt2=0;
for(ll j=i; j<=mid; j*=i) // j<MAX 错,这时很可能mid>MAX
cnt2+= mid/j; // mid! 含i多少个
if(cnt2>=cnt)
right=mid;
else left=mid+1;
}
ans=max(ans,left);
}
cout<<ans<<endl;
return 0;
}


C:暴力枚举,符合条件的用排列组合统计

用到取逆

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <vector>
using namespace std;
#define ll long long
#define mod 1000000007
#define N 1000500
ll pow_mod(ll a,ll b)
{
ll ret=1;
while(b)
{
if(b&1)
ret*=a;
b>>=1;
a*=a;
ret%=mod;
a%=mod;
}
return ret;
}
ll a,b,n;
ll m
,rev
;
inline bool judge(ll x)
{
while(x)
{
if(x%10!=a && x%10!=b)
return false;
x/=10;
}
return true;
}
int main ()
{

while(cin>>a>>b>>n)
{
m[0]=1;rev[0]=1;
for(int i=1;i<=n;++i)
{
m[i]=m[i-1]*((ll)i)%mod;
rev[i]=pow_mod(m[i],mod-2);
}
ll ans=0;
for(int x=0;x<=n;++x)
{
int y=n-x;
ll num=a*x+b*y;
if(judge(num))
{
ans+=m
*rev[x]%mod*rev[n-x];
ans%=mod;
}
}
cout<<ans<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: