ACM-ICPC 2018 沈阳赛区网络预赛 G 容斥原理
2024-09-01 21:52:33
https://nanti.jisuanke.com/t/31448
解析 易得an=n*n+n O(1)得到前n项和 再删除与m不互素的数 我们用欧拉函数求出m的质因数 枚举其集合的子集 进行容斥
n*n+n+2n*2n+2n+3n*3n+3n=(1+4+9)*n*n+(1+2+3)*n 所以也可以O(1)得到。
AC代码
#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define all(a) (a).begin(), (a).end()
#define fillchar(a, x) memset(a, x, sizeof(a))
#define huan printf("\n");
#define debug(a,b) cout<<a<<" "<<b<<" ";
using namespace std;
const int maxn=1e5+,inf=0x3f3f3f3f;
typedef long long ll;
typedef pair<int,int> pii;
const ll mod=1e9+;
int yin[maxn],cnt;
void euler(ll n) //返回euler(n)
{
ll res=n,a=n;
cnt=;
for(ll i=; i*i<=a; i++)
{
if(a%i==)
{
yin[cnt++]=i;
res=res/i*(i-);//先进行除法是为了防止中间数据的溢出 爆int
while(a%i==)
a/=i;
}
}
if(a>)
res=res/a*(a-),yin[cnt++]=a;
}
ll powmod(ll n,ll m)
{
ll ans=;
while(m>)
{
if(m&)
ans=ans*n%mod;
m = m>>;
n = n*n%mod;
}
return ans;
}
ll inv2=powmod(,mod-);
ll inv6=powmod(,mod-);
ll getsum1(ll n)
{
return n*(n+)%mod*(*n%mod+)%mod*inv6%mod;
}
ll getsum2(ll n)
{
return n*(n+)%mod*inv2%mod;
}
int main()
{
ll n,m;
while(scanf("%lld%lld",&n,&m)!=EOF)
{
euler(m);
ll ans=(getsum1(n)+getsum2(n))%mod;
for(int i=; i<(<<cnt); i++)
{
ll temp=,jishu=;
for(int j=; j<cnt; j++)
{
if(i&(<<j))
temp*=yin[j],jishu++;
}
if(temp==)continue;
ll bei=n/temp;
ans=(ans+powmod(-,jishu)*temp*temp%mod*getsum1(bei)%mod+mod)%mod;
ans=(ans+powmod(-,jishu)*temp*getsum2(bei)%mod+mod)%mod;
}
printf("%lld\n",ans);
}
}
最新文章
- .NET Core中合并Expression<;Func<;T,bool>;>;的正确姿势
- c中的数组与字符串
- JDK自带方法实现AES对称加密
- HDU 4770 Lights Against DudelyLights
- vim 学习日志(2):set的使用方法
- 书签(Bookmarks)
- hdu 3047 Zjnu Stadium(加权并查集)2009 Multi-University Training Contest 14
- JVM内存状况查看方法和分析工具
- ExtJS4.2学习(16)制作表单(转)
- Android常用Manager整理
- Python 基础-python-列表-元组-字典-集合
- Codeforces 159D Palindrome pairs
- td文字过长部分显示,鼠标移动显示全部内容
- Java学习记录第一章
- h1b期间回国须知
- [CQOI 2010]扑克牌
- 正则表达式中的re.S
- 存储树形的数据表转为Json
- 元类编程-- metaclass
- jQuery单选多选按钮选中美化特效