2 条题解
-
0
by qkw:
#include <bits/stdc++.h> using namespace std; typedef long long LL; LL sum[20], a[110], b[1010], c[1010]; char st[60]; // sum为剩余的未排列的各个数字的个数 LL cc()//计算排列剩余数字的方法数 { //剩下的部分比较板 LL len = 0; for(int i = 0; i <= 9; i++) for(int j = 1; j <= sum[i]; j++) b[++len] = len, c[len] = j; for(int i = 1; i <= len; i++) for(int j = 1; j <= len; j++) { LL d = __gcd(b[i], c[j]); b[i] /= d, c[j] /= d; } LL ans = 1; for(int i = 1; i <= len; i++) ans *= b[i]; return ans; } LL dfs(int x) { if(x == 0) return 0; LL ans = 0; for(int i = 0; i < a[x]; i++) if(sum[i])//一定要有这个数才能执行操作 { sum[i]--;//将当前位设置为i ans += cc();//计算排列数 sum[i]++;//还原 } sum[a[x]]--; ans += dfs(x - 1);//计算下一位 sum[a[x]]++; return ans; } LL calc(int len) { for(int i = 1; i <= len; i++) sum[a[i]]++; return dfs(len); } int main() { scanf("%s", st + 1); int len = strlen(st + 1);//输入有亿点点长,记得用字符串 for(int i = 1; i <= len; i++) a[len + 1 - i] = st[i] - 48; printf("%lld\n", calc(len)); return 0; } -
0
by qkw:
#include<bits/stdc++.h> using namespace std; typedef long long LL; LL sum[20],a[110],b[1010],c[1010];char st[60]; //sum为剩余的未排列的各个数字的个数 LL cc()//计算排列剩余数字的方法数 { //剩下的部分比较板 LL len=0; for(int i=0;i<=9;i++)for(int j=1;j<=sum[i];j++)b[++len]=len,c[len]=j; for(int i=1;i<=len;i++)for(int j=1;j<=len;j++) { LL d=__gcd(b[i],c[j]); b[i]/=d,c[j]/=d; } LL ans=1;for(int i=1;i<=len;i++)ans*=b[i]; return ans; } LL dfs(int x) { if(x==0)return 0; LL ans=0; for(int i=0;i<a[x];i++)if(sum[i])//一定要有这个数才能执行操作 { sum[i]--;//将当前位设置为i ans+=cc();//计算排列数 sum[i]++;//还原 } sum[a[x]]--; ans+=dfs(x-1);//计算下一位 sum[a[x]]++; return ans; } LL calc(int len) { for(int i=1;i<=len;i++)sum[a[i]]++; return dfs(len); } int main() { scanf("%s",st+1);int len=strlen(st+1);//输入有亿点点长,记得用字符串 for(int i=1;i<=len;i++)a[len+1-i]=st[i]-48; printf("%lld\n",calc(len)); return 0; }
- 1
信息
- ID
- 4090
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 8
- 标签
- 递交数
- 94
- 已通过
- 12
- 上传者