题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=6745
写这道题的时候一直tle,结果发现是因为用的是cin却在a完上一题把cin.tie(0)和ios::sync_with_stdio(0)不小心删了。。。直到结束后才发现
思路:举个例子 求(a,b)逐步减一到两者均为一时一共有多少次互质可以看作 ans(a,b)=max((a-1,b),(a,b-1))+1。(加一的前提是(a,b)互质)。
#include <bits/stdc++.h> #include <cassert> #define INF 0x3f3f3f3f #define ll long long using namespace std; int w[10005],c[10005]; int ans,v; int f[1005][1005],g[1005][1005]; int gcd(int a,int b) { if(b == 0) return a; return gcd(b,a%b); } int main() { cin.tie(0); ios::sync_with_stdio(0); int t; int ans;cin >> t; f[1][1]=1;g[1][1]=1; for(int i=1;i<=1000;i++) { for(int j=1;j<=1000;j++) { if(i==1) f[i][j]=f[i][j-1]+1; else if(j==1) f[i][j]=f[i-1][j]+1; else { if(gcd(i,j)==1) { f[i][j]=max(f[i-1][j],f[i][j-1])+1; } else f[i][j]=max(f[i-1][j],f[i][j-1]); } } } while(t--) { int a,b; cin >> a >>b; printf("%d\n",f[a][b]); } return 0; }