[NOIP2017模拟]切蛋糕

题目:
[NOIP2017模拟]切蛋糕_第1张图片
[NOIP2017模拟]切蛋糕_第2张图片
[NOIP2017模拟]切蛋糕_第3张图片

分析:刚开始分析样例,发现样例1:6=2*3,4=2+3-1;样例2:15=3*5,7=3+5-1,然后就把这特殊的性质当恒成立打进去了……其实,不看数据,分析就可知要切的地方必为n质因数的整数倍处,即和n不互质的数处,所以,世界上就有一个神奇的欧拉函数可以计算小于n且与n互质的数:
这里写图片描述
于是,一切都那么简单……
还有一个小地方,代码中nn最后如果大于1为什么只可能是最后一个质因数呢?因为现在的nn大于1只可能是还没有枚举到剩下的这个数(或某个数的因数),但这个数已经大于根号n了,所以不可能是两个及以上质数相乘了,不然光这几个个质因数相乘就已经大于n了。

代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;

int n;

void find()
{
    int ans=n,nn=n;
    for(int i=2;i<=int(sqrt(n));++i)
        if(nn%i==0)
        {
            ans=ans-ans/i;//利用欧拉函数求与n互质的数(别告诉我变了一下形,分了一下步你就看不懂了==)
            while(nn%i==0)//将n中的质数i除完,保证后面枚举的合数不会被算进来
                nn=nn/i;
        }

    if(nn>1)//如果还有一个大于根号n的质因数就再乘一项 
        ans=ans-ans/nn;
    printf("%d\n",n-ans);//要切的地方是小于n且与n不互质的数(这里多了一个n本身,正好就是块数) 
}

int main()
{
    freopen("cake.in","r",stdin);
    freopen("cake.out","w",stdout);

    scanf("%d",&n);
    find();
    return 0;
}

本题结。

你可能感兴趣的:([NOIP2017模拟]切蛋糕)