P8692 [蓝桥杯 2019 国 C] 数正方形
思路:观察正方形有两种放置方式,正放和斜放,其中正放的个数等于边长的平方,斜放的个数等于边长减1,所以有如下求法:
首先注意到我们得到的数据是点数,而非边数,然后就是公式了,(n-i)的平方就是正放边长为i的正方形的数量,对于斜放的正方形数量等于(n-i)的平方减去(i-1),所以就得到了下面的公式
#include <iostream>
using namespace std;int main()
{int n;cin>>n;long long ans=0; for(int i=1;i<n;i++){ans+=i*(long long)(n-i)*(n-i);ans%=1000000007;}cout<<ans<<endl;return 0;
}
P8754 [蓝桥杯 2021 省 AB2] 完全平方数
思路: 把每个数都拆成i个互质数相乘,我们都知道一个完全平方数一定可以拆成某几个的互质数的偶数次方相乘,然后就把我们这个数拆成n个互质数相乘,那个数的数量不是偶数的,记录下来,最后输出这些数的乘积即可
#include <iostream>
using namespace std;
#define ll long long
int main()
{ll n=0;ll x=1;cin>>n;for(ll i=2;i*i<=n;i++){if(n%i==0){int cnt=0;while(n%i==0){n/=i;cnt++;}if(cnt%2!=0) x*=i;}}if(n!=1) x*=n;cout<<x;return 0;
}