注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Yavin(某沙茶的代码库)

Star Wars fan and OIer

 
 
 

日志

 
 

SGU370 暴力容斥  

2012-10-07 15:37:12|  分类: SGU300系列 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
很裸的模型吧
就是n-1,m-1中互质的对数+2(视情况而定)
本想用欧拉函数搞的,结果惨败
只能暴力了,很高兴,暴力的时间复杂度是很优的
于是过了

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;

typedef long long LL;
const int MAX=1000000+10;

int n,m;
int prime[MAX],f[MAX],q[MAX],hash[MAX],st[MAX];

int gcd(int a,int b)
{
if(!b)return a;
return gcd(b,a%b);
}

int dfs(int now,int p,int N,int flag)
{
if(now==st[0]+1)
return N/p*flag;
int ans=dfs(now+1,p,N,flag);
ans+=dfs(now+1,p*st[now],N,flag*-1);
return ans;
}

int get(int u,int N)
{
int p=u;
st[0]=0;
while(p!=1)
{
if(hash[prime[p]]!=u)
{
st[++st[0]]=prime[p];
hash[prime[p]]=u;
}
p/=prime[p];
}
return dfs(1,1,N,1);
}

int main()
{
#ifndef ONLINE_JUDGE
freopen("input.txt","r",stdin);freopen("output.txt","w",stdout);
#endif
int i,j;
LL ans=0;
scanf("%d %d",&n,&m);
--n,--m;
for(i=2;i<MAX;++i)
{
if(!prime[i])prime[i]=i,q[++q[0]]=i,f[i]=i-1;
for(j=1;q[j]*i<MAX;++j)
{
prime[q[j]*i]=q[j];
if(i%q[j]==0)
{
f[i*q[j]]=f[i]*q[j];
break;
}
f[i*q[j]]=f[i]*(q[j]-1);
}
}
for(i=1;i<=n;++i)
ans+=get(i,m);
cout<<ans+(n>0)+(m>0)<<endl;
}




  评论这张
 
阅读(210)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018