【CF963C】Cutting Rectangle(数论,构造,map)

题意:

 思路:考虑构造最小的单位矩形然后平铺

单位矩形中每种矩形的数量可以根据比例算出来,为c[i]/d,其中d是所有c[i]的gcd,如果能构造成功答案即为d的因子个数

考虑如果要将两种矩形放在同一行那他们的w一定相等,且对于每一行h全部出现过并且比例相当

具体实现的时候用map套vector,发现map有好多写法

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 typedef long long ll;
  4 typedef unsigned int uint;
  5 typedef unsigned long long ull;
  6 typedef long double ld;
  7 typedef pair<int,int> PII;
  8 typedef pair<ll,ll> Pll;
  9 typedef vector<int> VI;
 10 typedef vector<PII> VII;
 11 typedef pair<ll,ll>P;
 12 #define N  2000000+10
 13 #define M  200000+10
 14 #define INF 1e9
 15 #define fi first
 16 #define se second
 17 #define MP make_pair
 18 #define pb push_back
 19 #define pi acos(-1)
 20 #define mem(a,b) memset(a,b,sizeof(a))
 21 #define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
 22 #define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
 23 #define lowbit(x) x&(-x)
 24 #define Rand (rand()*(1<<16)+rand())
 25 #define id(x) ((x)<=B?(x):m-n/(x)+1)
 26 #define ls p<<1
 27 #define rs p<<1|1
 28 #define fors(i) for(auto i:e[x]) if(i!=p)
 29 
 30 const int MOD=998244353,inv2=(MOD+1)/2;
 31       //int p=1e4+7;
 32       //double eps=1e-6;
 33       int dx[4]={-1,1,0,0};
 34       int dy[4]={0,0,-1,1};
 35 
 36 int read()
 37 {
 38    int v=0,f=1;
 39    char c=getchar();
 40    while(c<48||57<c) {if(c=='-') f=-1; c=getchar();}
 41    while(48<=c&&c<=57) v=(v<<3)+v+v+c-48,c=getchar();
 42    return v*f;
 43 }
 44 
 45 struct node
 46 {
 47     ll w,h,c;
 48 }a[N];
 49 
 50 map<ll,vector<Pll>> mp;
 51 vector<Pll> c;
 52 
 53 ll readll()
 54 {
 55    ll v=0,f=1;
 56    char c=getchar();
 57    while(c<48||57<c) {if(c=='-') f=-1; c=getchar();}
 58    while(48<=c&&c<=57) v=(v<<3)+v+v+c-48,c=getchar();
 59    return v*f;
 60 }
 61 
 62 ll gcd(ll x,ll y)
 63 {
 64     if(y==0) return x;
 65     return gcd(y,x%y);
 66 }
 67 
 68 int isok()
 69 {
 70     for(auto &element:mp)
 71     {
 72         if(element.se.size()!=c.size()) return 0;
 73         int n=c.size();
 74         ll d=0;
 75         rep(i,0,n-1) d=gcd(d,element.se[i].se);
 76         rep(i,0,n-1)
 77         {
 78             element.se[i].se/=d;
 79             if(element.se[i]!=c[i]) return 0;
 80         }
 81     }
 82     return 1;
 83 }
 84 
 85 int main()
 86 {
 87     //freopen("1.in","r",stdin);
 88     //freopen("1.out","w",stdout);
 89     int n=read();
 90     ll K=0;
 91     rep(i,1,n)
 92     {
 93         a[i].w=readll(),a[i].h=readll(),a[i].c=readll();
 94         K=gcd(K,a[i].c);
 95         mp[a[i].w].pb(Pll(a[i].h,a[i].c));
 96     }
 97     for(auto &element:mp)
 98     {
 99         for(auto &x:element.se) x.se/=K;
100         sort(element.se.begin(),element.se.end());
101     }
102 
103     c=mp.begin()->se;
104     ll d=0;
105     for(auto &x:c) d=gcd(d,x.se);
106     for(auto &x:c) x.se/=d;
107     if(!isok())
108     {
109         printf("0
");
110         return 0;
111     }
112     int ans=0;
113     int t=sqrt(K);
114     rep(i,1,t)
115      if(K%i==0)
116      {
117          ans++;
118          if(1ll*i*i!=K) ans++;
119      }
120     printf("%d
",ans);
121     return 0;
122 }
原文地址:https://www.cnblogs.com/myx12345/p/11938118.html