hdu 6053 TrickGCD(筛法+容斥)
来源:互联网 发布:考试做题软件 编辑:程序博客网 时间:2024/05/20 02:28
题意:
给出a数组,问有能构成多少个长度与a相等的b数组,每个对应位置b比a小,并且gcd(b[1],b[n])>1.
a[i]<=100000.
解题思路:
看着大神的代码补的:
http://www.cnblogs.com/jhz033/p/7246028.html
看范围就知道要去枚举gcd,对于每个gcd,在a[i]这个位置上有gcd/a[i]个数能满足条件构成b[i],只要把每个位置求出来累乘就好了,但是这个过程还需要优化。
优化可以用素数筛法类似的方式,把gcd/a[i]相同的数都一起处理,这样在用一个快速幂把相同的那些情况数算出来,时间复杂度就是n*logn*logn。
但是答案显然会有重复,赛时就是这个问题不会解决然后gg。
num[i]表示gcd为i时求出的符合情况数,显然它包含了i的倍数对应的情况,我们需要把这些数减去,但是倍数的情况显然也有重复,比较复杂。
这个过程我们可以倒过来从上界往下去容斥,这样每次对于num[i]来说,它的倍数的情况都是已经处理好了的,只要依次减去倍数的情况了,其实相当于一个dp的过程。。
代码:
#include <bits/stdc++.h>#define LL long longusing namespace std;const int maxn=1e5+5;const int mod=1e9+7;int sum[maxn];int book[maxn];LL num[maxn];LL qmod(int a, int b){ LL res=1, base=a; while(b) { if(b&1)res=res*base%mod; b>>=1; base=base*base%mod; } return res;}int main(){ int t, i, j, e=1; cin>>t; while(t--) { int n; scanf("%d", &n); int x; memset(book, 0, sizeof book); memset(sum, 0, sizeof sum); for(i=1; i<=n; i++) { scanf("%d", &x); book[x]++; } for(i=1; i<=100000; i++) { sum[i]=sum[i-1]+book[i]; } for(i=2; i<=100000; i++) { num[i]=1LL; for(j=0; j<=100000; j+=i) { int b; if(j+i-1>100000)b=sum[100000]-sum[j-1]; else if(j==0)b=sum[i-1]; else b=sum[j+i-1]-sum[j-1]; int a=j/i; if(a==0 && b) { num[i]=0LL; break; } else if(b) { num[i]=num[i]*qmod(a, b)%mod; } } } LL ans=0; for(i=100000; i>=2; i--) { for(j=i+i; j<=100000; j+=i) { num[i]-=num[j], num[i]=(num[i]%mod+mod)%mod; } ans=(ans+num[i])%mod; } printf("Case #%d: %lld\n", e++, ans%mod); }}
阅读全文
1 0
- hdu 6053 TrickGCD(筛法+容斥)
- hdu 6053 TrickGCD 【容斥&筛法|莫比乌斯】
- Hdu 6035 -TrickGCD (容斥加速)
- hdu 6053 TrickGCD 容斥 莫比乌斯
- HDU 6053 TrickGCD 线性筛 思维 容斥
- 2017 杭电多校联赛第二场 1009 TrickGCD(容斥原理) HDU 6053
- hdu 6053 TrickGCD(容斥,分段,莫比乌斯函数)
- HDU 6053 TrickGCD(分块+容斥)——2017 Multi-University Training Contest
- hdu 6053 TrickGCD 容斥原理(莫比乌斯工具)
- 2017多校训练赛第二场 HDU 6053 TrickGCD(容斥原理/莫比乌斯反演)
- 2017多校联合第二场 1009题 hdu 6053 TrickGCD (超详细!!!)莫比乌斯 容斥
- HDU 6053 TrickGCD DP(筛法)
- 2017多校第二场 HDU 6053 TrickGCD 容斥,素数,思维
- HDU 6053 TrickGCD 【容斥定理】【莫比乌斯函数】
- 【 hdu 6053】 TrickGCD 【数论 容斥 + 莫比乌斯函数 】
- HDU 6053 TrickGCD(枚举)
- HDU6053 TrickGCD(容斥原理)
- HDU 6053 TrickGCD
- Python多线程--(1)之基本概念
- shape与reshape
- create 与 store中的关系
- hi3516a制作内核和文件系统
- 百度DNS解析过程
- hdu 6053 TrickGCD(筛法+容斥)
- hdu6034(Balala Power!)
- Spring MVC I18N 国际化配置
- java加密之AES/ECB/PKCS5Padding
- JVM调优:选择合适的GC collector (二)
- 【Android Studio】Android Monitor无法显示运行程序问题解决
- Netty实现WebSocket
- 修改tomcat配置的后SpringMVC的RESTful实现
- 【数据库】 主键,外键,主表,从表,关联表,父表,子表