2 条题解
-
0
#include <bits/stdc++.h> using namespace std; typedef long long LL; const int mod = 1e9; struct node { LL a[110]; int len; node() { memset(a, 0, sizeof(a)); len = 1; } }; node operator* (node n1, int x) { node no; no.len = n1.len; for (int i = 1; i <= no.len; i++) no.a[i] = n1.a[i] * x; for (int i = 1; i <= no.len; i++) no.a[i + 1] += no.a[i] / mod, no.a[i] %= mod; int i = no.len; while (no.a[i + 1] > 0) { i++, no.a[i + 1] += no.a[i] / mod, no.a[i] %= mod; } no.len = i; return no; } int ksm(int a, int b) { int res = 1; a = a % 1000; for (; b; b >>= 1, a = a * a % 1000) if (b & 1) res = res * a % 1000; return res; } int a[110], b[110]; node C(int n, int m) { node no; if (m > n) return no; for (int i = 1; i <= m; i++) a[i] = n - i + 1, b[i] = i; for (int i = 1; i <= m; i++) { for (int j = 1; j <= m; j++) { if (b[i] == 1) break; int d = __gcd(b[i], a[j]); b[i] /= d; a[j] /= d; } } no.a[1] = 1; for (int i = 1; i <= m; i++) no = no * a[i]; return no; } int main() { int k, x; cin >> k >> x; x = ksm(x, x); node ans = C(x - 1, k - 1); // 插板法 printf("%lld", ans.a[ans.len]); for (int i = ans.len - 1; i >= 1; i--) printf("%09lld", ans.a[i]); printf("\n"); return 0; } -
0
#include<bits/stdc++.h> using namespace std; typedef long long LL; const int mod=1e9; struct node { LL a[110];int len; node(){memset(a,0,sizeof(a));len=1;} }; node operator* (node n1,int x) { node no;no.len=n1.len; for(int i=1;i<=no.len;i++)no.a[i]=n1.a[i]*x; for(int i=1;i<=no.len;i++)no.a[i+1]+=no.a[i]/mod,no.a[i]%=mod; int i=no.len; while(no.a[i+1]>0) { i++,no.a[i+1]+=no.a[i]/mod,no.a[i]%=mod; } no.len=i; return no; } int ksm(int a,int b) { int res=1;a=a%1000; for(;b;b>>=1,a=a*a%1000)if(b&1)res=res*a%1000; return res; } int a[110],b[110]; node C(int n,int m) { node no; if(m>n)return no; for(int i=1;i<=m;i++)a[i]=n-i+1,b[i]=i; for(int i=1;i<=m;i++) { for(int j=1;j<=m;j++) { if(b[i]==1) break; int d= __gcd(b[i],a[j]); b[i]/=d; a[j]/=d; } } no.a[1]=1; for(int i=1;i<=m;i++)no=no*a[i]; return no; } int main() { int k,x;cin>>k>>x; x=ksm(x,x); node ans=C(x-1,k-1);//插板法 printf("%lld",ans.a[ans.len]); for(int i=ans.len-1;i>=1;i--)printf("%09lld",ans.a[i]); printf("\n"); return 0; }
- 1
信息
- ID
- 617
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 8
- 标签
- 递交数
- 148
- 已通过
- 27
- 上传者