题意:求满足条件的(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. DownAlbum:Chrome的pinterest批量下载插件

    一.DownAlbum安装 二.DownAlbum使用 点击DownAlbum图标. 选择Normal. 会出现一个加载的弹窗,等待片刻会打开一个新的窗口. 按Ctrl+S,即可保存相册所有图片. 图 ...

  2. Kylin工作原理、体系架构

    核心思想:预计算. 对多维分析可能用到的度量进行预计算,将计算好的结果保存成Cube,并存在HBase中,供查询时直接访问 将高复杂度的聚合运算.多表连接……操作转换成对预计算结果的查询.决定了Kyl ...

  3. 杭电hdu-6168 Numbers

    这一题是考察排序与后续数据处理的题.我是用了map来给“和”做标记,把确定为a数组内数的数两两求和.给这些和标记,这样就可以很好的处理带有重复数的数据了~~ 贴个碼: #include<iost ...

  4. Linux学习之用户与root

    因为想要建立建立一个目录,但是发现权限不够,因为没用root登陆,所以学习了一下普通用户与root之间如何切换以及如何创建用户的一些知识. 1.pwd命令可以查看当前用户 $这个符号代表的就是普通用户 ...

  5. BZOJ 3878 【AHOI2014】 奇怪的计算器

    题目链接:奇怪的计算器 如果没有溢出的话,所有的标记都可以在线段树上直接维护,所以一棵线段树就解决问题了. 现在有了溢出,怎么办呢? 发现就算溢出了,各个元素的相对大小关系也是不变的.所以,如果一开始 ...

  6. python 下载大文件

    当使用requests的get下载大文件/数据时,建议使用使用stream模式. 当把get函数的stream参数设置成False时,它会立即开始下载文件并放到内存中,如果文件过大,有可能导致内存不足 ...

  7. 【NPOI】WebAPI-使用NPOI导出Excel

    1.安装nuget包 2.封装方法 public byte[] ExportToByteArray(IEnumerable<string> headerText, IEnumerable& ...

  8. Java SE HashMap的底层实现

    1.hash散列算法 由于hashmap在存储过程中是数组加链表的存储过程,所以定义数组长度为16(建议是2的n次幂的长度),之后进行每个数组的地址都指向一个链表进行存储 hash表算法可对数组长度l ...

  9. 给大一新生学习c程序的一些建议的一些建议

    这是一篇给刚学习c程序的学弟们的一篇日志.如果想学好c程序,以及不想走太多弯路,希望能看一下这篇文章,如果说基础较好,或者说已经是大二,大三,这篇文章不会有什么帮助. 刚转到软件工程系,加了几个新生群 ...

  10. java 虹软ArcFace 2.0,java SDK使用、人脸识别-抽取人脸特征并做比对

    java人脸识别 虹软ArcFace 2.0,java SDK使用.人脸识别-抽取人脸特征并做比对 虹软产品地址:http://ai.arcsoft.com.cn/product/arcface.ht ...