MT21. 公约数
描述
输入描述
第一行第 n , k , a ,b。接下来一行 n 个数,每张牌上的数字输出描述
输出方案数示例1
输入:
5 2 12 6 4 4 1 2 3
输出:
3
C++14 解法, 执行用时: 4ms, 内存消耗: 480KB, 提交时间: 2020-09-14
#include <bits/stdc++.h> using namespace std; int gcd(int x, int y){ int t = x%y; while(t != 0){ x = y; y = t; t = x%y; } return y; } int main(){ int n, K, A, B; scanf("%d%d%d%d", &n, &K, &A, &B); long a[n], dp[100010][n+1]={0}; for(int i=0;i<n;i++) scanf("%ld", &a[i]); vector<int> v; for(int i=1;i*i<=A;i++){ if(A%i==0){ v.push_back(i); if(A/i != i) v.push_back(A/i); } } sort(v.begin(), v.end()); for(int i=0;i<n;i++) for(int j=K;j>0;j--){ if(j==1){ dp[gcd(a[i], A)][j] += 1; break; } for(auto &x: v) dp[gcd(a[i]*x, A)][j] += dp[x][j-1]; } long s = 0; for(int i=B;i<=A;i++) s += dp[i][K]; printf("%ld\n", s); return 0; } /* 10 5 9 7 26703 29033 28408 2406 10166 20266 12303 11340 11458 5642 */
C++ 解法, 执行用时: 5ms, 内存消耗: 504KB, 提交时间: 2020-12-22
#include<bits/stdc++.h> using namespace std; const int maxn=120; long long int arr[maxn]; long long int dp[100010][52]; int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); long long int n,k,a,b; cin>>n>>k>>a>>b; for(int i=0;i<n;++i) cin>>arr[i]; vector<int>vec; vec.push_back(1); vec.push_back(a); for(int i=2;i*i<=a;++i) { if(a%i==0) { vec.push_back(i); if(a/i!=i) vec.push_back(a/i); } } sort(vec.begin(),vec.end()); for(int i=0;i<n;++i) { for(int j=k;j>0;--j) { if(j==1) { dp[__gcd(arr[i],a)][j]+=1; break; } for(int l=0;l<vec.size();++l) { dp[__gcd(arr[i]*vec[l],a)][j]+=dp[vec[l]][j-1]; } } } long long int ans=0; for(int i=b;i<=a;++i) { ans+=dp[i][k]; } cout<<ans<<"\n"; return 0; }