codeforces #589 div2 ABCD E待补

A. Distinct Digits

Description

Solution

B. Filling the Grid

Description

Solution

模拟题意,找出没有被固定的方格个数,快速幂。

  1 #include <algorithm>
  2 #include <cctype>
  3 #include <cmath>
  4 #include <cstdio>
  5 #include <cstdlib>
  6 #include <cstring>
  7 #include <iostream>
  8 #include <map>
  9 #include <numeric>
 10 #include <queue>
 11 #include <set>
 12 #include <stack>
 13 #if __cplusplus >= 201103L
 14 #include <unordered_map>
 15 #include <unordered_set>
 16 #endif
 17 #include <vector>
 18 #define lson rt << 1, l, mid
 19 #define rson rt << 1 | 1, mid + 1, r
 20 #define LONG_LONG_MAX 9223372036854775807LL
 21 #define pblank putchar(' ')
 22 #define ll LL
 23 #define fastIO ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
 24 using namespace std;
 25 typedef long long ll;
 26 typedef long double ld;
 27 typedef unsigned long long ull;
 28 typedef pair<int, int> P;
 29 int n, m, k;
 30 const int maxn = 1e5 + 10;
 31 const ll mod = 1000000007;
 32 template <class T>
 33 inline T read()
 34 {
 35     int f = 1;
 36     T ret = 0;
 37     char ch = getchar();
 38     while (!isdigit(ch))
 39     {
 40         if (ch == '-')
 41             f = -1;
 42         ch = getchar();
 43     }
 44     while (isdigit(ch))
 45     {
 46         ret = (ret << 1) + (ret << 3) + ch - '0';
 47         ch = getchar();
 48     }
 49     ret *= f;
 50     return ret;
 51 }
 52 template <class T>
 53 inline void write(T n)
 54 {
 55     if (n < 0)
 56     {
 57         putchar('-');
 58         n = -n;
 59     }
 60     if (n >= 10)
 61     {
 62         write(n / 10);
 63     }
 64     putchar(n % 10 + '0');
 65 }
 66 template <class T>
 67 inline void writeln(const T &n)
 68 {
 69     write(n);
 70     puts("");
 71 }
 72 template <typename T>
 73 void _write(const T &t)
 74 {
 75     write(t);
 76 }
 77 template <typename T, typename... Args>
 78 void _write(const T &t, Args... args)
 79 {
 80     write(t), pblank;
 81     _write(args...);
 82 }
 83 template <typename T, typename... Args>
 84 inline void write_line(const T &t, const Args &... data)
 85 {
 86     _write(t, data...);
 87 }
 88 int h, w;
 89 int r[maxn], c[maxn];
 90 int mp[1010][1010];
 91 int main(int argc, char const *argv[])
 92 {
 93 #ifndef ONLINE_JUDGE
 94     freopen("in.txt", "r", stdin);
 95     // freopen("out.txt","w", stdout);
 96 #endif
 97     h = read<int>(), w = read<int>();
 98     for (int i = 1; i <= h; i++)
 99         r[i] = read<int>();
100     for (int i = 1; i <= w; i++)
101         c[i] = read<int>();
102     for (int i = 1; i <= h; i++)
103         if (r[i])
104         {
105             for (int j = 1; j <= r[i]; j++)
106                 mp[i][j] = 1;
107             mp[i][r[i] + 1] = -1;
108         }
109         else
110             mp[i][1] = -1;
111     int f = 1;
112     for (int i = 1; i <= w; i++)
113         if (c[i])
114         {
115             for (int j = 1; j <= c[i]; j++)
116             {
117                 if (mp[j][i] == -1)
118                 {
119                     f = 0;
120                     break;
121                 }
122                 mp[j][i] = 1;
123             }
124             if (mp[c[i] + 1][i] == 1)
125             {
126                 f = 0;
127                 break;
128             }
129             else
130                 mp[c[i] + 1][i] = -1;
131         }
132         else
133         {
134             if (mp[1][i] == 1)
135             {
136                 f = 0;
137                 break;
138             }
139             else
140                 mp[1][i] = -1;
141         }
142     ll res = 0;
143     for (int i = 1; i <= h; i++)
144         for (int j = 1; j <= w; j++)
145             if (!mp[i][j])
146                 ++res;
147     ll ans = 1;
148     ll base = 2;
149     for (; res; res >>= 1)
150     {
151         if (res & 1)
152             ans = ans * base % mod;
153         base = base * base % mod;
154     }
155     if (f)
156         writeln(ans);
157     else
158         puts("0");
159     return 0;
160 }
View Code

C. Primes and Multiplication

Description

Solution

注意到g(x,y)是计算x里y的最大幂次约数。

那么答案可以转换为$n!$里包含的x素因子的最大幂次约数之积。

唯一分解+阶乘素因子分解。

!!!由于n数量级在1e18,其阶乘的素因子指数有可能爆int,注意开ll。(wa了一发)

  1 #include <algorithm>
  2 #include <numeric>
  3 #include <cctype>
  4 #include <cmath>
  5 #include <cstdio>
  6 #include <cstdlib>
  7 #include <cstring>
  8 #include <iostream>
  9 #include <map>
 10 #include <queue>
 11 #include <set>
 12 #include <stack>
 13 #if __cplusplus >= 201103L
 14 #include <unordered_map>
 15 #include <unordered_set>
 16 #endif
 17 #include <vector>
 18 #define lson rt << 1, l, mid
 19 #define rson rt << 1 | 1, mid + 1, r
 20 #define LONG_LONG_MAX 9223372036854775807LL
 21 #define pblank putchar(' ')
 22 #define ll LL
 23 #define fastIO ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
 24 using namespace std;
 25 typedef long long ll;
 26 typedef long double ld;
 27 typedef unsigned long long ull;
 28 typedef pair<int, int> P;
 29 ll n, m, k;
 30 const int maxn = 1e6 + 10;
 31 const ll mod = 1e9 + 7;
 32 template <class T>
 33 inline T read()
 34 {
 35     int f = 1;
 36     T ret = 0;
 37     char ch = getchar();
 38     while (!isdigit(ch))
 39     {
 40         if (ch == '-')
 41             f = -1;
 42         ch = getchar();
 43     }
 44     while (isdigit(ch))
 45     {
 46         ret = (ret << 1) + (ret << 3) + ch - '0';
 47         ch = getchar();
 48     }
 49     ret *= f;
 50     return ret;
 51 }
 52 template <class T>
 53 inline void write(T n)
 54 {
 55     if (n < 0)
 56     {
 57         putchar('-');
 58         n = -n;
 59     }
 60     if (n >= 10)
 61     {
 62         write(n / 10);
 63     }
 64     putchar(n % 10 + '0');
 65 }
 66 template <class T>
 67 inline void writeln(const T &n)
 68 {
 69     write(n);
 70     puts("");
 71 }
 72 template <typename T>
 73 void _write(const T &t)
 74 {
 75     write(t);
 76 }
 77 template <typename T, typename... Args>
 78 void _write(const T &t, Args... args)
 79 {
 80 write(t), pblank;
 81  _write(args...);
 82 }
 83 template <typename T, typename... Args>
 84 inline void write_line(const T &t, const Args &... data)
 85 {
 86    _write(t, data...);
 87    puts("");
 88 }
 89 int prime[maxn], vis[maxn], pcnt;
 90 void init(){
 91     for (int i = 2; i < maxn;i++){
 92         if (!vis[i])
 93             prime[pcnt++] = i;
 94         for (int j = 0; j < pcnt && i * prime[j] < maxn;j++){
 95             vis[i * prime[j]] = 1;
 96             if (i%prime[j]==0)
 97                 break;
 98         }
 99     }
100 }
101 ll fac[maxn], tot;
102 inline ll qpow(ll base,ll n){
103     ll res = 1;
104     while(n){
105         if(n&1)
106             res = res * base % mod;
107         base = base * base % mod;
108         n >>= 1;
109     }
110     return res;
111 }
112 ll f(ll n, int p)
113 {
114     if (n == 0)
115         return 0;
116     return f(n / p, p) + n / p;
117 }
118 int main(int argc, char const *argv[])
119 {
120 #ifndef ONLINE_JUDGE
121     freopen("in.txt","r", stdin);
122     // freopen("out.txt","w", stdout);
123 #endif
124     init();
125     ll x = read<ll>();
126     n = read<ll>();
127     for (int i = 0; i < pcnt;i++){
128         if (x%prime[i]==0){
129             fac[tot++] = prime[i];
130             while(x%prime[i]==0)
131                 x /= prime[i];
132         }
133     }
134     if (x!=1)
135         fac[tot++] = x;
136     ll res = 1;
137     for (int i = 0; i < tot;i++){
138         ll t = f(n, fac[i]);
139         res = res * qpow(fac[i], t) % mod;
140     }
141     writeln(res);
142     return 0;
143 }
View Code

D. Complete Tripartite

Description

给出一个可能不连通的无自环无向图,问是否能划分出三个点集。

任意两个点集应该满足每一个顶点到另一个集合的任意点有边,自己点集内任意两点无边相连。

Solution

自己思路补全,看了题解才会。

首先想到dfs一遍判断图是否连通,不连通直接输出-1。

首先将所有点染色为1。

遍历所有染色1的点的邻接点v,如果v的颜色依然为1,则将其标为2。

遍历所有染色2的点的邻接点v,如果v的颜色依然为2,则将其标为3。

做完以上步骤,可以保证三个点集内部点不互相连。

接下来使用点的度数判断是否满足点集间互相有边。

再者是判断是否有一个集合为空。

判断完输出结果。

  1 #include <algorithm>
  2 #include <cctype>
  3 #include <cmath>
  4 #include <cstdio>
  5 #include <cstdlib>
  6 #include <cstring>
  7 #include <iostream>
  8 #include <map>
  9 #include <numeric>
 10 #include <queue>
 11 #include <set>
 12 #include <stack>
 13 #if __cplusplus >= 201103L
 14 #include <unordered_map>
 15 #include <unordered_set>
 16 #endif
 17 #include <vector>
 18 #define lson rt << 1, l, mid
 19 #define rson rt << 1 | 1, mid + 1, r
 20 #define LONG_LONG_MAX 9223372036854775807LL
 21 #define pblank putchar(' ')
 22 #define ll LL
 23 #define fastIO ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
 24 using namespace std;
 25 typedef long long ll;
 26 typedef long double ld;
 27 typedef unsigned long long ull;
 28 typedef pair<int, int> P;
 29 int n, m, k;
 30 const int maxn = 1e5 + 10;
 31 template <class T>
 32 inline T read()
 33 {
 34     int f = 1;
 35     T ret = 0;
 36     char ch = getchar();
 37     while (!isdigit(ch))
 38     {
 39         if (ch == '-')
 40             f = -1;
 41         ch = getchar();
 42     }
 43     while (isdigit(ch))
 44     {
 45         ret = (ret << 1) + (ret << 3) + ch - '0';
 46         ch = getchar();
 47     }
 48     ret *= f;
 49     return ret;
 50 }
 51 template <class T>
 52 inline void write(T n)
 53 {
 54     if (n < 0)
 55     {
 56         putchar('-');
 57         n = -n;
 58     }
 59     if (n >= 10)
 60     {
 61         write(n / 10);
 62     }
 63     putchar(n % 10 + '0');
 64 }
 65 template <class T>
 66 inline void writeln(const T &n)
 67 {
 68     write(n);
 69     puts("");
 70 }
 71 template <typename T>
 72 void _write(const T &t)
 73 {
 74     write(t);
 75 }
 76 template <typename T, typename... Args>
 77 void _write(const T &t, Args... args)
 78 {
 79     write(t), pblank;
 80     _write(args...);
 81 }
 82 template <typename T, typename... Args>
 83 inline void write_line(const T &t, const Args &... data)
 84 {
 85     _write(t, data...);
 86 }
 87 int col[maxn], deg[maxn];
 88 vector<int> g[maxn];
 89 void dfs(int u, int p)
 90 {
 91     col[u] = 1;
 92     int sz = g[u].size();
 93     for (int i = 0; i < sz; i++)
 94     {
 95         int v = g[u][i];
 96         if (col[v])
 97             continue;
 98         dfs(v, u);
 99     }
100 }
101 int main(int argc, char const *argv[])
102 {
103 #ifndef ONLINE_JUDGE
104     freopen("in.txt", "r", stdin);
105     // freopen("out.txt","w", stdout);
106 #endif
107     n = read<int>(), m = read<int>();
108     for (int i = 0; i < m; i++)
109     {
110         int x = read<int>(), y = read<int>();
111         g[x].emplace_back(y), g[y].emplace_back(x);
112         deg[x]++, deg[y]++;
113     }
114     dfs(1, 0);
115     int p = accumulate(col + 1, col + 1 + n, 0);
116     if (p != n)
117     {
118         puts("-1");
119         return 0;
120     }
121     for (int i = 1; i <= n; i++)
122     {
123         if (col[i] == 1)
124         {
125             int sz = g[i].size();
126             for (int j = 0; j < sz; j++)
127             {
128                 int k = g[i][j];
129                 if (col[k] == 1)
130                     col[k] = 2;
131             }
132         }
133     }
134     for (int i = 1; i <= n; i++)
135     {
136         if (col[i] == 2)
137         {
138             int sz = g[i].size();
139             for (int j = 0; j < sz; j++)
140             {
141                 int k = g[i][j];
142                 if (col[k] == 2)
143                     col[k] = 3;
144             }
145         }
146     }
147     int s[4] = {0};
148     for (int i = 1; i <= n; i++)
149         ++s[col[i]];
150     int f = 1;
151     if (!s[1]||!s[2]||!s[3])
152         f = 0;
153     for (int i = 1; i <= n&&f;i++){
154         int cur = 0;
155         for (int j = 1; j <= 3;j++)
156             if (j!=col[i])
157                 cur += s[j];
158         if (cur!=deg[i])
159             f = 0;
160     }
161     if (f)
162         for (int i = 1;i<=n;i++)
163             write(col[i]), pblank;
164     else
165         puts("-1");
166         return 0;
167 }
View Code

猜你喜欢

转载自www.cnblogs.com/mooleetzi/p/11774712.html