链接:戳这里
思路:额,对于出题人也是醉了,居然卡long long溢出,所以还是改成减法吧
四边形定义:任意一边小于三边和 对了还有=0的情况 真的是!!!无力吐槽
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<string> #include<vector> #include <ctime> #include<queue> #include<set> #include<map> #include<stack> #include<iomanip> #include<cmath> #define mst(ss,b) memset((ss),(b),sizeof(ss)) #define maxn 0x3f3f3f3f #define MAX 1000100 ///#pragma comment(linker, "/STACK:102400000,102400000") typedef long long ll; typedef unsigned long long ull; #define INF (1ll<<60)-1 using namespace std; int T; ll a[10]; int main(){ scanf("%d",&T); while(T--){ for(int i=0;i<4;i++) scanf("%I64d",&a[i]); if(a[0]==0 || a[1]==0 || a[2]==0 || a[3]==0) { cout<<"No"<<endl; continue; } sort(a,a+4); if(a[0]>a[3]-a[2]-a[1]) cout<<"Yes"<<endl; else cout<<"No"<<endl; } return 0; }
思路:这道题最后也没做出来,太弱了,想的时候肯定知道是dp,想过dp[i][j]是当前i各数最小公倍数为j的种数,但是处理的时候想着容斥去了,判断当前的j不是最小公倍数的时候多算了多少,想复杂了 啊啊啊啊 居然没有想到枚举到当前第i数,选或不选 最小公倍数为j的个数, 可以把当前a[i]加到gcd(j,a[i])中去 哎 还是太弱了 转个弯就想到了
dp[i][j]+=dp[i-1][j] (不选)
dp[i][gcd(j,a[i])]+=dp[i-1][j] (选了之后会有什么影响)
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<string> #include<vector> #include <ctime> #include<queue> #include<set> #include<map> #include<stack> #include<iomanip> #include<cmath> #define mst(ss,b) memset((ss),(b),sizeof(ss)) #define maxn 0x3f3f3f3f #define MAX 1000100 ///#pragma comment(linker, "/STACK:102400000,102400000") typedef long long ll; typedef unsigned long long ull; #define INF (1ll<<60)-1 #define mod 100000007 using namespace std; int a[100100]; int T,n; ll dp[1010][1010],g[1010][1010]; /// 当前选第i个数 且已选的数的gcd=j 个种数 int gcd(int x,int y){ return x%y==0 ? y:gcd(y,x%y); } int main(){ scanf("%d",&T); for(int i=1;i<=1000;i++){ for(int j=1;j<=1000;j++){ g[i][j]=gcd(i,j); } } while(T--){ mst(dp,0); scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); sort(a+1,a+n+1); for(int i=1;i<=n;i++) dp[i][a[i]]=1; for(int i=1;i<=n;i++){ for(int j=1;j<=a[i];j++){ dp[i][j]=(dp[i][j]+dp[i-1][j])%mod; int k=g[j][a[i]]; dp[i][k]=(dp[i][k]+dp[i-1][j])%mod; } } ll ans=0; for(int i=1;i<=a[n];i++){ ans+=(ll)dp[n][i]*i; ans%=mod; } printf("%I64d\n",ans); } return 0; }