A - Little C Loves 3 I
CodeForces - 1047A
题意:一个数分成三份,每一个都不是3的倍数
题解:分成 (1, 1, n - 2) 或者分成(1, 2, n - 3 )
#include#include #include #include #include #include #include #include #include
B - Cover Points
CodeForces - 1047B
题意:平面上有n个点,用一个顶点在原点,两直角边分别在x轴和y轴的等腰直角三角形覆盖这些点,问能将这些点全部覆盖的三角形的直角边最短是多长
题解:求解max(x + y)
#include#include #include #include #include #include #include #include #include
C - Enlarge GCD
CodeForces - 1047C
题意:n个数的gcd是k,要你删掉最少的数使得删完后的数组的gcd > k
题解:先求出k,然后每个数除以k。然后找出出现次数最多的质因数即可。
#include#include #include #include #include #include #include #include #include
D - Little C Loves 3 II
CodeForces - 1047D
题意:给你n*m得棋盘,让你找两点之间距离为3的点的个数,不能重复使用,距离定义,两坐标差绝对值之和、
题解:找规律,找特殊样例即可
#include#include #include #include #include #include #include #include #include
E - Region Separation
CodeForces - 1047E
题意:给定一棵大小为n的树,点有点权,在一个方案中可以将整棵树划分多次,要求每次划分后各个联通块的权值和相等,问有多少种划分方案
转自:
#include#include #include #include #include #include using namespace std;#define LL long longconst int MAXN = 1e6 + 10;const int INF = 0x3f3f3f3f;const int MOD = 1e9 + 7;LL s[MAXN];LL f[MAXN],p[MAXN],ans[MAXN];LL gcd(LL a,LL b){ return b == 0 ? a : gcd(b,a % b);}int main(){ int n; LL tot = 0; scanf("%d",&n); for(int i = 1; i <=n; i++) scanf("%lld",&s[i]); for(int i = 2; i <= n; i++) scanf("%lld",&p[i]); for(int i = n; i;i--) s[p[i]] += s[i]; for(int i = n; i;i--) s[i] = s[1] / gcd(s[1],s[i]); for(int i = 1; i <= n; i++) { if (s[i] <= n) { f[s[i]]++; } } for(int i = n; i; i--) for(int j = 2 * i; j <= n; j += i){ f[j] = (f[j] + f[i]) % MOD; } for(int i=ans[1]=1;i<=n;i++) if(f[i]>=i) for(int j=i*2;j<=n;j+=i) ans[j] = (ans[j] + ans[i]) % MOD; for(int i=1;i<=n;i++) if(f[i]>=i) tot = (tot + ans[i]) % MOD; printf("%lld\n",tot);}