Codeforces 476D Dreamoon and Sets 规律+构造

2015-07-20 17:26:13 · 作者: · 浏览: 5

题目链接:点击打开链接

题意:

输出n组集合,每组4个。

对于任意一组中的4个元素,一组内任意2个数的gcd==k

且n组的所有数字各不相同。

要使得n组中最大的数字最小。

问:

输出最大的那个数,并输出n组的数字。

思路:

首先能得到,当把这组数字都/k,则任意两个数互质。

然后就是规律:

1 2 3 5

7 8 9 11

对应+6

#include 
  
   
#include 
   
     #include 
    
      #include 
     
       #include 
      
        #include 
        #include 
        
          #include 
         
           template 
          
            inline bool rd(T &ret) { char c; int sgn; if(c=getchar(),c==EOF) return 0; while(c!='-'&&(c<'0'||c>'9')) c=getchar(); sgn=(c=='-')?-1:1; ret=(c=='-')?0:(c-'0'); while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0'); ret*=sgn; return 1; } template 
           
             inline void pt(T x) { if (x <0) { putchar('-'); x = -x; } if(x>9) pt(x/10); putchar(x%10+'0'); } using namespace std; typedef long long ll; #define N 200010 const ll mod = 1000000007; ll n, k, ans; vector
            
             G[10001]; ll gcd(ll a, ll b){ if(a>b)swap(a,b); while(a){ b %= a; swap(a,b); } return b; } void solve(int x){ G[x].clear(); if(x==1){ G[x].push_back(1); G[x].push_back(2); G[x].push_back(3); G[x].push_back(5); } else { G[x].push_back(G[x-1][0]+6); G[x].push_back(G[x-1][1]+6); G[x].push_back(G[x-1][2]+6); G[x].push_back(G[x-1][3]+6); } } int main() { while(cin>>n>>k){ ans = 1; for(int i = 1; i <= n; i++)solve(i); pt((G[n][3])*k); puts(""); for(int i = 1; i <= n; i++){ for(int j = 0; j < G[i].size(); j++){ pt(G[i][j] * k); j==G[i].size()-1 ? putchar('\n'):putchar(' '); } } } return 0; }