赛后才知道计算公式是256乘1024乘1024乘8除以32,泪崩==
#include<bits/stdc++.h> using namespace std; int num[10]; bool check(int n) {
while(n>0) { if(num[n%10]==0) return false; num[n%10]--; n/=10; } return true; }
int main() { fill(num,num+10,2021); for(int i=1;1;i++) { if(!check(i)) { cout<<i
-1<<endl; return 0; } } return 0; }
答案注意减1,泪崩
比赛时把直线公式的kx+b的k和b存进去了,然而非常不友好的浮点数,呜呜呜,待补题
弱者不配说话,只配注释
#include<bits/stdc++.h> using namespace std; long long num=2021041820210418;
long long yin[100000005]; int cnt=0; int main() { int j=0; for(long long i=1;i<=
sqrt(num);i++) { if(num%i==0) { yin[j++]=i; yin[j++]=num/i; //注意这一步,比赛时没注意到,我是弱者
} } for(int i=0;i<j;i++) for(int n1=0;n1<j;n1++) for(int n2=0;n2<j;n2++)
//易看出,长宽高肯定是因子之间的相乘,因子只有128个,3重循环就很简单了 { if(yin[i]*yin[n1]*yin[n2]==num) { cnt++
; } } cout<<cnt<<endl; }
#include<bits/stdc++.h> #define INF 2147483647 using namespace std; const int
maxn= 1e4 + 5; const int inf = 0x3f3f3f3f; bool vis[maxn]; int dis[maxn]; int c1
, c2; struct node { int u, w; //u为起始点,w为值,以vector数组的下标作为起始点 node(int x, int y):u
(x), w(y) {} bool operator < (const node& r)const //运算符重置,用来让优先队列按w的值从小到大往下排 {
return w > r.w; } }; vector<node>e[maxn]; void add_edge(int u, int v, int w) { e
[u].push_back(node(v, w)); } void dij(int st) //st为起始点 ,最短路模板 { fill(vis, vis +
maxn, false); //fill函数类似于memset,但是memset是用来设置ascii码的 fill(dis, dis + maxn, inf);
priority_queue<node>pque; dis[st] = 0; pque.push(node(st, 0)); while (!pque.
empty()) { node t = pque.top(); pque.pop(); int u = t.u; if (vis[u]) continue;
vis[u] = true; for (int i = 0; i < e[u].size(); i++) { int v = e[u][i].u;
//每次将最小边压进优先队列中 int w = e[u][i].w; if (!vis[v] && dis[v] > dis[u] + w) { dis[v]
= dis[u] + w; pque.push(node(v, dis[v])); } } } } int main() { for (int i = 1; i
< 2021; i++) for(int j = i+1; j-i <= 21&&j<=2021 ; j++) { add_edge(i , j , i/
__gcd(i,j)*j); //最小公倍数的计算公式 add_edge(j , i , i/__gcd(i,j)*j); } dij(1); cout<<
dis[2021]<<endl; }