• 【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 }
  • 相关阅读:
    WPF中的Command事件绑定
    WPF的EventAggregator的发布和订阅
    IE浏览器如何调试Asp.net的 js代码
    MVVM模式用依赖注入的方式配置ViewModel并注册消息
    SQL处理数组,字符串转换为数组
    C#在函数内部获取函数的参数
    JS判断字符串长度(中文长度为2,英文长度为1)
    .net一般处理程序(httphandler)实现文件下载功能
    SQL分页获取数据
    URI编码解码
  • 原文地址:https://www.cnblogs.com/myx12345/p/11938118.html
Copyright © 2020-2023  润新知