题意:求满足条件的(i,j)对数:\(gcd(v,a_i)=x,lcm(v,a_j)=y\)

题解:\(x|a_i,a_j|y\),\(x|y\),考虑质因子p,假设a_i中p次数为a,x中次数为b,y为c,\(a_j\)为d;a>=b,c>=d.

假设a>b,c>d,那么由于\(gcd(v,a_i)=x\),v中p的次数为b,由于\(lcm(v,a_j)=y\),那么\(max(b,d)==c\),又c>d,所以b=c<a和x|y矛盾,所以此时ij不满足条件

其他情况同理,能证明当a>b,c>d不同时满足时,都能,满足条件,考虑y的质因子只有15个,二进制状压,表示1为a>b,0为a==b,那么当两个二进制数and起来为0时,ij对满足条件.

分解质因子用泼辣的肉,and用fwt或者sosdp都行

//#pragma GCC optimize(2)
//#pragma GCC optimize(3)
//#pragma GCC optimize(4)
//#pragma GCC optimize("unroll-loops")
//#pragma comment(linker, "/stack:200000000")
//#pragma GCC optimize("Ofast,no-stack-protector")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include<bits/stdc++.h>
#define fi first
#define se second
#define db double
#define mp make_pair
#define pb push_back
#define pi acos(-1.0)
#define ll long long
#define vi vector<int>
#define mod 1000000009
#define ld long double
//#define C 0.5772156649
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#define pll pair<ll,ll>
#define pil pair<int,ll>
#define pli pair<ll,int>
#define pii pair<int,int>
#define ull unsigned long long
//#define base 1000000000000000000
#define fin freopen("a.txt","r",stdin)
#define fout freopen("a.txt","w",stdout)
#define fio ios::sync_with_stdio(false);cin.tie(0)
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline void sub(ll &a,ll b){a-=b;if(a<0)a+=mod;}
inline void add(ll &a,ll b){a+=b;if(a>=mod)a-=mod;}
template<typename T>inline T const& MAX(T const &a,T const &b){return a>b?a:b;}
template<typename T>inline T const& MIN(T const &a,T const &b){return a<b?a:b;}
inline ll qp(ll a,ll b){ll ans=1;while(b){if(b&1)ans=ans*a%mod;a=a*a%mod,b>>=1;}return ans;}
inline ll qp(ll a,ll b,ll c){ll ans=1;while(b){if(b&1)ans=ans*a%c;a=a*a%c,b>>=1;}return ans;}
inline ll qm(ll a,ll b,ll c){ll ans=0;while(b){if(b&1)ans=(ans+a)%c;a=(a+a)%c;b>>=1;}return ans%c;}
inline ll qpow(ll a,ll b,ll c){ll ans=1;while(b){if(b&1)ans=qm(ans,a,c)%c;a=qm(a,a,c)%c;b>>=1;}return ans;} using namespace std; const ull ba=233;
const db eps=1e-10;
const ll INF=0x3f3f3f3f3f3f3f3f;
const int N=200000+10,maxn=100000+10,inf=0x3f3f3f3f; int cnt;
ll f[110];
bool check(ll a,ll n,ll x,ll sum){
ll judge=qpow(a,x,n);
if (judge==n-1||judge==1)return 1;
while (sum--){
judge=qm(judge,judge,n);
if (judge==n-1)return 1;
}
return 0;
}
bool miller(ll n){
if (n<2)return 0;
if (n==2)return 1;
if ((n&1)==0)return 0;
ll x=n-1,sum=0;
while (x%2==0)x>>=1,sum++;
for (ll i=1;i<=20;i++){
ll a=rand()%(n-1)+1;
if (!check(a,n,x,sum))return 0;
}
return 1;
}
ll pollard(ll n,ll c){
ll x,y,d,i=1,k=2;
x=rand()%n;y=x;
while (1){
i++;
x=(qm(x,x,n)+c)%n;
d=gcd(y-x,n);
if (d<0)d=-d;
if (d>1&&d<n)return d;
if (y==x)return n;
if (i==k)y=x,k<<=1;
}
}
void Find(ll n){
if(n==1)return;
if (miller(n)){
f[cnt++]=n;
return ;
}
ll p=n;
while (p>=n) p=pollard(p,rand()%(n-1)+1);
Find(n/p);Find(p);
}
ll a[N],b[N],c[N];
int cal(ll x,ll y)
{
int ans=0;
while(x%y==0)ans++,x/=y;
return ans;
}
void fwt_and(ll *a,int n,int dft)
{
for(int i=1;i<n;i<<=1)
for(int j=0;j<n;j+=i<<1)
for(int k=j;k<j+i;k++)
{
if(dft==1)a[k]=a[k]+a[i+k];
else a[k]=a[k]-a[i+k];
}
}
int main()
{
int n;ll x,y;scanf("%d%lld%lld",&n,&x,&y);
if(y%x)return 0*puts("0");
Find(y);
sort(f,f+cnt);cnt=unique(f,f+cnt)-f;
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
int p1=0,p2=0;
for(int j=0;j<cnt;j++)if(cal(x,f[j])!=cal(y,f[j]))
{
p1+=(1<<j)*(cal(a[i],f[j])>cal(x,f[j]));
p2+=(1<<j)*(cal(a[i],f[j])<cal(y,f[j]));
}
if(a[i]%x==0)b[p1]++;
if(y%a[i]==0)c[p2]++;
}
fwt_and(b,(1<<cnt),1);fwt_and(c,(1<<cnt),1);
for(int i=0;i<(1<<cnt);i++)b[i]=b[i]*c[i];
fwt_and(b,(1<<cnt),-1);
printf("%lld\n",b[0]);
return 0;
}
/******************** ********************/
//#pragma GCC optimize(2)
//#pragma GCC optimize(3)
//#pragma GCC optimize(4)
//#pragma GCC optimize("unroll-loops")
//#pragma comment(linker, "/stack:200000000")
//#pragma GCC optimize("Ofast,no-stack-protector")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include<bits/stdc++.h>
#define fi first
#define se second
#define db double
#define mp make_pair
#define pb push_back
#define pi acos(-1.0)
#define ll long long
#define vi vector<int>
#define mod 1000000009
#define ld long double
//#define C 0.5772156649
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#define pll pair<ll,ll>
#define pil pair<int,ll>
#define pli pair<ll,int>
#define pii pair<int,int>
#define ull unsigned long long
//#define base 1000000000000000000
#define fin freopen("a.txt","r",stdin)
#define fout freopen("a.txt","w",stdout)
#define fio ios::sync_with_stdio(false);cin.tie(0)
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline void sub(ll &a,ll b){a-=b;if(a<0)a+=mod;}
inline void add(ll &a,ll b){a+=b;if(a>=mod)a-=mod;}
template<typename T>inline T const& MAX(T const &a,T const &b){return a>b?a:b;}
template<typename T>inline T const& MIN(T const &a,T const &b){return a<b?a:b;}
inline ll qp(ll a,ll b){ll ans=1;while(b){if(b&1)ans=ans*a%mod;a=a*a%mod,b>>=1;}return ans;}
inline ll qp(ll a,ll b,ll c){ll ans=1;while(b){if(b&1)ans=ans*a%c;a=a*a%c,b>>=1;}return ans;}
inline ll qm(ll a,ll b,ll c){ll ans=0;while(b){if(b&1)ans=(ans+a)%c;a=(a+a)%c;b>>=1;}return ans%c;}
inline ll qpow(ll a,ll b,ll c){ll ans=1;while(b){if(b&1)ans=qm(ans,a,c)%c;a=qm(a,a,c)%c;b>>=1;}return ans;} using namespace std; const ull ba=233;
const db eps=1e-10;
const ll INF=0x3f3f3f3f3f3f3f3f;
const int N=200000+10,maxn=100000+10,inf=0x3f3f3f3f; int cnt;
ll f[110];
bool check(ll a,ll n,ll x,ll sum){
ll judge=qpow(a,x,n);
if (judge==n-1||judge==1)return 1;
while (sum--){
judge=qm(judge,judge,n);
if (judge==n-1)return 1;
}
return 0;
}
bool miller(ll n){
if (n<2)return 0;
if (n==2)return 1;
if ((n&1)==0)return 0;
ll x=n-1,sum=0;
while (x%2==0)x>>=1,sum++;
for (ll i=1;i<=20;i++){
ll a=rand()%(n-1)+1;
if (!check(a,n,x,sum))return 0;
}
return 1;
}
ll pollard(ll n,ll c){
ll x,y,d,i=1,k=2;
x=rand()%n;y=x;
while (1){
i++;
x=(qm(x,x,n)+c)%n;
d=gcd(y-x,n);
if (d<0)d=-d;
if (d>1&&d<n)return d;
if (y==x)return n;
if (i==k)y=x,k<<=1;
}
}
void Find(ll n){
if(n==1)return;
if (miller(n)){
f[cnt++]=n;
return ;
}
ll p=n;
while (p>=n) p=pollard(p,rand()%(n-1)+1);
Find(n/p);Find(p);
}
ll a[N];
int b[N],c[N];
int cal(ll x,ll y)
{
int ans=0;
while(x%y==0)ans++,x/=y;
return ans;
}
int main()
{
int n;ll x,y;scanf("%d%lld%lld",&n,&x,&y);
if(y%x)return 0*puts("0");
Find(y);
sort(f,f+cnt);cnt=unique(f,f+cnt)-f;
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
int p1=0,p2=0;
for(int j=0;j<cnt;j++)if(cal(x,f[j])!=cal(y,f[j]))
{
p1+=(1<<j)*(cal(a[i],f[j])>cal(x,f[j]));
p2+=(1<<j)*(cal(a[i],f[j])<cal(y,f[j]));
}
if(a[i]%x==0)b[p1]++;//,printf("%d %d\n",i,p1);
c[i]=p2;
}
for(int i=0;i<cnt;i++)for(int j=0;j<(1<<cnt);j++)
if(j&(1<<i))b[j]+=b[j^(1<<i)];
ll ans=0;
for(int i=1;i<=n;i++)
{
if(y%a[i]!=0)continue;
ans+=b[((1<<cnt)-1)^c[i]];
// printf("%d %d\n",((1<<cnt)-1)^c[i],b[((1<<cnt)-1)^c[i]]);
}
printf("%lld\n",ans);
return 0;
}
/******************** ********************/

Educational Codeforces Round 48 (Rated for Div. 2)G. Appropriate Team的更多相关文章

  1. Educational Codeforces Round 48 (Rated for Div. 2) CD题解

    Educational Codeforces Round 48 (Rated for Div. 2) C. Vasya And The Mushrooms 题目链接:https://codeforce ...

  2. Educational Codeforces Round 39 (Rated for Div. 2) G

    Educational Codeforces Round 39 (Rated for Div. 2) G 题意: 给一个序列\(a_i(1 <= a_i <= 10^{9}),2 < ...

  3. Educational Codeforces Round 48 (Rated for Div. 2)

    http://codeforces.com/contest/1016 A. 没想到这个也会TLE,太粗心了 B. 暴力就好了,多情况讨论又出错... 思路跟我一样的解法   为什么我做了那么多讨论,原 ...

  4. Educational Codeforces Round 48 (Rated for Div. 2) B 1016B Segment Occurrences (前缀和)

    B. Segment Occurrences time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  5. Educational Codeforces Round 48 (Rated for Div. 2)异或思维

    题:https://codeforces.com/contest/1016/problem/D 题意:有一个 n * m 的矩阵, 现在给你 n 个数, 第 i 个数 a[ i ] 代表 i 这一行所 ...

  6. Educational Codeforces Round 48 (Rated for Div. 2)——A. Death Note ##

    A. Death Note time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  7. Educational Codeforces Round 48 (Rated for Div. 2) D 1016D Vasya And The Matrix (构造)

    D. Vasya And The Matrix time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  8. 【Educational Codeforces Round 48 (Rated for Div. 2) C】 Vasya And The Mushrooms

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 显然在没有一直往右走然后走到头再往上走一格再往左走到头之前. 肯定是一直在蛇形走位.. 这个蛇形走位的答案贡献可以预处理出来.很容易 ...

  9. 【Educational Codeforces Round 48 (Rated for Div. 2) D】Vasya And The Matrix

    [链接] 我是链接,点我呀:) [题意] 告诉你每一行.每一列的异或和. 让你求出一个符合要求的原矩阵. [题解] 显然应该有 a1^a2^....^an = b1^b2^....^bn 也即两边同时 ...

随机推荐

  1. html 之 position 绝对定位与相对定位(待补充)

    相对定位:对于区块标签而言,占着原有的空间 绝对定位:对于网页而言,不占原来的空间

  2. HihoCoder 1195 高斯消元·一(高斯消元)

    题意 https://hihocoder.com/problemset/problem/1195 思路 高斯消元是解决高元方程的一种算法,复杂度 \(O(n^3)\) . 过程大致是: 构造一个未知数 ...

  3. JavaScript(ES5)知识点梳理

    数据类型(null undefined number string boolean object)数据类型之间的相互转化(Boolean Number String parseInt parseFlo ...

  4. Node内核基本自带模块fs 文件的读写

    在node的内核中存在一些内置的模块 这些是最基本的服务端所必要的 1:node全局环境:global类似于浏览器端的window 2:文件读取模块:fs fs模块同时提供了异步和同步的方法. 'us ...

  5. 运行和控制Nginx——命令行参数和信号

    参考资料: Nginx中文文档: http://www.nginx.cn/nginxchscommandline Nginx的启动.停止.平滑重启.信号控制和平滑升级:http://zachary-g ...

  6. P1948 [USACO08JAN]电话线Telephone Lines

    传送门 思路: 二分+最短路径:可以将长度小于等于 mid 的边视为长度为 0 的边,大于 mid 的边视为长度为 1 的边,最后用 dijkstra 检查 d [ n ] 是否小于等于 k 即可. ...

  7. c语言关键字的区分

    const int a;//声明一个常整型数 int const a;//声明一个常整型数 const int *a;//声明指向常整型数的指针,整型数不可修改,指针可以修改 int * const ...

  8. PostMan做接口自动化测试

    try{ var jsonData = pm.response.json(); } catch (e) { console.log("No body"); } pm.environ ...

  9. AFM(3)---Maude使用说明

    load file-name 1可用绝对路径 2.可进入maude文件所在目录下load 3.默认工作空间是什么?

  10. TCP与UDP各自优缺点与区别

    TCP的优点: 可靠,稳定 TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认.窗口.重传.拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源. TCP的缺 ...