洛谷 P2231 [HNOI2002]跳蚤
2024-08-28 04:43:17
https://www.luogu.org/problemnew/show/P2231
题意相当于:
有n个位置a[1..n],每个位置可以填[1,m]中任一个整数,问共有多少种填法满足gcd(a[1],a[2],..,a[n],m)=1
可以反演一下
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<cmath>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
const ll N=;
ll prime[N+],len;
bool nprime[N+];
ll ans;
ll poww(ll a,ll b)
{
ll bs=a,an=;
for(;b;b>>=,bs*=bs)
if(b&)
an*=bs;
return an;
}
ll getmu(ll x)
{
ll i,ans=,ed=sqrt(x+0.5);
bool fl;
for(i=;i<=len&&prime[i]<=ed;i++)
{
fl=;
while(x%prime[i]==)
{
if(fl) return ;
fl=;
x/=prime[i];
ans*=(-);
}
}
if(x!=) ans*=(-);
return ans;
}
ll n,m;
void work(ll d)
{
ans+=poww(m/d,n)*getmu(d);
}
int main()
{
ll i,j;
for(i=;i<=N;i++)
{
if(!nprime[i]) prime[++len]=i;
for(j=;j<=len&&i*prime[j]<=N;j++)
{
nprime[i*prime[j]]=;
if(i%prime[j]==) break;
}
}
scanf("%lld%lld",&n,&m);
ll ed=sqrt(m+0.5);
for(i=;i<=ed;i++)
if(m%i==)
{
work(i);
if(m/i!=i) work(m/i);
}
printf("%lld",ans);
return ;
}
最新文章
- 两种适用于中小量数据的mysql数据备份
- easyUI 操作
- hadoop datanode 挂机恢复后,多复制的块删除的问题
- 201453408刘昊阳 《Java程序设计》第5周学习总结
- a:link,a:visited,a:hover,a:active
- struts2 jsp 传参 NullPointerException问题解决
- [转]JAVA程序员一定知道的优秀第三方库(2016版)
- ipa上传到APP store
- 遇到autoreconf: not found
- sql语句分页代码
- Secure CRT 如何连接虚拟机里面的CentOS系统 当主机没有网的时候 作者原创 欢迎转载
- vim代码粘贴缩进混乱的问题[Linux]
- vmware三种网络格式
- 基于 IJKPlayer-concat 协议的视频无缝拼接技术实现
- [ABP] ASP.NET Zero 5.6.0 之 ASP.NET Zero Power Tools 破解日志
- #实验三 敏捷开发与XP实践---实验报告
- spring 获取对象的注解
- 【BZOJ1826】[JSOI2010]缓存交换(贪心)
- 让某个软件无法被操作员最小化(C#演示)
- MeToo, one year on