百度百科上容斥原理的解释:
公式
例题
算法分析
//求最大公约数
#define ll long long
int gad(int a,int b)
{
return b==0?a:gad(b,a%b);
}
//求最小公倍数
ll lcm(int a,int b)
{
return a*b/gad(a,b);
}
int getabc(int n,int a,int b,int c)
{
ll num1=lcm(a,b);
ll num2=lcm(b,c);
ll num3=lcm(a,c)
ll ans=n/a+n/b+n/c-n/lcm(a,b)-n/lcm(a,c)-n/lcm(b,c)+n/lcm(num1,lcm(num2,num3));
return ans;
}
题目一
题目链接
#define ll long long
ll gcd(int a,int b)
{
return b==0? a:gcd(b,a % b);
}
ll lcm(int a, int b)
{
return a / gcd(a,b) * b;
}
int MIN(ll a, ll b)
{
return a < b? a: b;
}
int nthUglyNumber(int n, int a, int b, int c)
{
ll num1 = lcm(a,b);
ll num2 = lcm(b,c);
ll num3 = lcm(a,c);
ll num0 = lcm(num1,lcm(num2,num3));
int min = MIN(a,MIN(b,c));
ll left = min;
ll right = min * n;
ll mid = 0;
while(left < right)
{
mid = (left + right) / 2;
int sum = mid / a + mid / b + mid / c - mid /num1 - mid / num2 -mid / num3 + mid / num0;
if(sum >= n)
right = mid;
else if(sum < n)
left = mid + 1 ;
}
return right;
题目二
题目链接
class Solution {
public:
int numMusicPlaylists(int n, int len, int dis) {
int mod=1e9+7;
long dp[101][101];
memset(dp,0,sizeof(dp));
dp[0][0]=1;
//i为听过歌的数量
//j为听了多少首歌
//dis是歌曲间隔
for(int i=1;i<=n;i++)
{
for(int j=1;j<=len;j++)
{
dp[i][j]+=dp[i][j-1]*max(0,(i-dis));
dp[i][j]+=dp[i-1][j-1]*(n-(i-1));
dp[i][j]%=mod;
}
}
return dp[n][len];
}
};
总结
写到这里也结束了,在文章最后放上一个小小的福利,以下为小编自己在学习过程中整理出的一个关于 java开发 的学习思路及方向。从事互联网开发,最主要的是要学好技术,而学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯,更加需要准确的学习方向达到有效的学习效果。
由于内容较多就只放上一个大概的大纲,需要更及详细的学习思维导图的 点击我的Gitee获取。
还有 高级java全套视频教程 java进阶架构师 视频+资料+代码+面试题!
全方面的java进阶实践技术资料,并且还有技术大牛一起讨论交流解决问题。