zoukankan      html  css  js  c++  java
  • 【CF819C】Mister B and Beacons on Field 数学

    【CF819C】Mister B and Beacons on Field

    题意外星人盯上了Farmer Jack的农场!我们假设FJ的农场是一个二维直角坐标系,FJ的家在原点。外星人向FJ的农场上投放了3个信标,不幸的是,有一个信标落地就完全损坏了,且不知道具体位置,其余两个信标分别被投放到了 $(m,0)​$ 和 $(0,n)$ 处。

    FJ对这些新的金闪闪的东西很感兴趣,他决定将这两个信标搬到家里去。具体地,FJ先从 $(0,0)$ 沿着 $x$ 轴走到 $(m,0)$ ,捡起信标,然后沿着 $x$ 轴返回 $(0,0)$ ,把信标放到家中。再从 $(0,0)$ 沿着 $y$ 轴走到 $(0,n)$ ,捡起信标,然后沿着 $y$ 轴返回 $(0,0)$ ,把信标放到家中。

    然而那两个没有损坏的信标在一直与外星人保持联系,它们一直在试图寻找那个损坏的信标的位置。具体地,当两个未损坏的信标的坐标都是整数时,如果存在平面上的一个整点,满足这个点与两个未损坏的信标组成的三角形面积为 $s$ ,则两个信标会向外星人发送一次信息。现在外星人想知道,在搬运的整个过程中,这两个信标一共会向外星人发送多少次信息?

    t组数据,$n=n_1cdot n_2cdot n_3$,$m,s$同理,$n_1,n_2,n_3...le 10^6$

    题解:先s*=2,然后分成两段考虑:

    从 $(n,0)$ 到 $(0,0)$ :因为这段简单就先考虑这段。如果当前走到 $(0,i)$ ,显然$i|s$就好了,所以枚举s的所有$le n$约数即可。

    从 $(m,0)$ 到 $(0,0)$ :考虑将面积转化成叉积的形式。如果当前走到 $(i,0)$ ,就变成问你$icdot y+(x-i)n=s$有没有整数解。根据裴蜀定理这个东西有整数解当且仅当$gcd(i,n)|s$。然后考虑容斥,如果$d=gcd(i,n) mid s$,则d中至少有一个质因子的系数大于s对应项的系数。所以答案等于至少0项的-至少1项的+至少2项的。。。

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    using namespace std;
    typedef long long ll;
    ll n,m,s,ans;
    int tot;
    int pn[60],pm[60],ps[60],pri[60];
    ll xp[60];
    int vis[1000010];
    inline void solve(int *cnt,int x)
    {
    	for(int i=2;i*i<=x;i++)	if(x%i==0)
    	{
    		if(!vis[i])	vis[i]=++tot,pri[tot]=i;
    		while(x%i==0)	x/=i,cnt[vis[i]]++;
    	}
    	if(x>1)
    	{
    		if(!vis[x])	vis[x]=++tot,pri[tot]=x;
    		cnt[vis[x]]++;
    	}
    }
    inline void init()
    {
    	memset(pn,0,sizeof(pn)),memset(pm,0,sizeof(pm)),memset(ps,0,sizeof(ps));
    	for(int i=1;i<=tot;i++)	vis[pri[i]]=0;
    }
    void dfs1(int x,ll now)
    {
    	if(now>n)	return ;
    	if(x>tot)
    	{
    		ans++;
    		return ;
    	}
    	dfs1(x+1,now);
    	for(int i=1;i<=ps[x];i++)	dfs1(x+1,now*=pri[x]);
    }
    void dfs2(int x,ll now,int flag)
    {
    	if(now>m)	return ;
    	if(x>tot)
    	{
    		ans+=flag*(m/now);
    		return ;
    	}
    	dfs2(x+1,now,flag);
    	if(pn[x]>ps[x])	dfs2(x+1,now*xp[x]*pri[x],-flag);
    }
    inline void work()
    {
    	int t;
    	n=m=s=1,ans=tot=0;
    	scanf("%d",&t),solve(pn,t),n*=t,scanf("%d",&t),solve(pn,t),n*=t,scanf("%d",&t),solve(pn,t),n*=t;
    	scanf("%d",&t),solve(pm,t),m*=t,scanf("%d",&t),solve(pm,t),m*=t,scanf("%d",&t),solve(pm,t),m*=t;
    	scanf("%d",&t),solve(ps,t),s*=t,scanf("%d",&t),solve(ps,t),s*=t,scanf("%d",&t),solve(ps,t),s*=t;
    	solve(ps,2),s<<=1;
    	dfs1(1,1);
    	for(int i=1,j;i<=tot;i++)	for(j=xp[i]=1;j<=ps[i];j++)	xp[i]*=pri[i];
    	dfs2(1,1,1);
    	printf("%lld
    ",ans);
    	init();
    }
    int main()
    {
    	freopen("beacon.in","r",stdin);
    	freopen("beacon.out","w",stdout);
    	int T;
    	scanf("%d",&T);
    	while(T--)	work();
    	return 0;
    }//1 10 6 18 2 103 2 13 1 13
  • 相关阅读:
    行列转换等经典SQL语句
    [jQuery]使用jQuery.Validate进行客户端验证(中级篇上)——不使用微软验证控件的理由
    深入分析jQuery.prototype.init选择器源码
    浅析jQuery基础框架
    GCC入门 ——-转载
    [转载]在VC中使用 Flash 美化你的程序
    用VS调试 javascript
    如何提高程序性能
    线程安全的懒单例模版类
    各种计算机语言的经典书籍 (转载)
  • 原文地址:https://www.cnblogs.com/CQzhangyu/p/8512887.html
Copyright © 2011-2022 走看看