1 条题解
-
0
自动搬运
来自洛谷,原作者为

Elairin176
AFOed(2021.10.23 - 2025.4.12)搬运于
2025-08-24 22:45:09,当前版本为作者最后更新于2023-02-13 19:12:34,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
传送门
数学好题。
首先,题目要求 是 的倍数, 是 的倍数,,所以 一定是 的因数。
接下来我们推一下 的值域。
比较好想,最大的时候柿子为 ,即 ,所以 。
最小的时候只能是 ,最大的时候需要考虑到 。最大时柿子为 ,这里容易发现 ,所以 。
最小的时候是 ,最大时柿子为 ,容易得出 ,所以 。
所以,我们可以先把 的因数找出来,之后枚举一下,超过 就不枚举。
设这个因数为 ,那么 ,。
,设 ,这里的 。
我们需要求出满足条件的 有多少组。
我们枚举 ,从 开始,不能出现 的情况。
容易发现,在 的情况下可以构造出一组解。这个柿子等同于 。
所以,这个问题转化成了求解 的因数数量。
只需要枚举到 就可以。
对于一个满足条件的 ,如何判断 也满足情况呢?
首先,需要有 。
这里需要判断能否构造出 ,如果 ,那么无法构造出 , 就不对。
还需要判断 。如果等于,说明 ,是错误的。
CODE://Code by __dest__ruct__or__(uid=592238) #include <iostream> #include <vector> using namespace std; #define umap unordered_map #define uset unordered_set #define ll long long #define ld long double #define pii pair<int,int> #define pll pair<long long,long long> const ll INF=9223372036854775807; namespace mySTL{ inline int max(int a,int b){return a>b?a:b;} inline int min(int a,int b){return a<b?a:b;} inline ll max(ll a,ll b){return a>b?a:b;} inline ll min(ll a,ll b){return a<b?a:b;} inline ld min(ld a,ld b){return a<b?a:b;} inline ld max(ld a,ld b){return a>b?a:b;} inline int _abs(int a){return a<0?-a:a;} inline int read(){char c=getchar();int f=1,ans=0; while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();} while(c>='0'&&c<='9')ans*=10,ans+=c-'0',c=getchar(); return ans*f;} inline long long readll(){char c=getchar();long long f=1,ans=0; while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();} while(c>='0'&&c<='9')ans*=10,ans+=c-'0',c=getchar(); return ans*f;} inline void swap(int &a,int &b){a^=b,b^=a,a^=b;} inline void swap(ll &a,ll &b){a^=b,b^=a,a^=b;} inline void write(int x){if(x<0){putchar('-');x=-x;} if(x>=10){write(x/10);}putchar(x%10+'0');} inline void writell(long long x){if(x<0){putchar('-');x=-x;} if(x>=10){writell(x/10);}putchar(x%10+'0');} inline ll pw(ll a,ll b,ll p){if(b==0)return 1; if(b==1)return a%p; ll mid=pw(a,b/2,p)%p; if(b&1)return mid*mid%p*a%p;else{return mid*mid%p;}} inline int gcd(int a,int b){return b?gcd(b,a%b):a;} inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;} inline int lcm(int a,int b){return a*b/gcd(a,b);} } using namespace mySTL; int n,ans,sz,a; vector<int>v; int main(void){ n=read(); for(int i=1;i<=n/i;i++){//求因数 if(n%i!=0){ continue; } v.push_back(i); if(i!=n/i){ v.push_back(n/i); } } sz=v.size(); for(int i=0;i<sz;i++){//枚举因数(构造a) if(v[i]>n/7){ continue; } a=n/v[i]-1; for(int j=2;j*v[i]<=(n-v[i])/3&&j<=a/j;j++){//构造y if(a%j==0){ ans++; if(a/j!=j&&(a-a/j)%(a/j)==0&&(a-a/j)!=(a/j)){//判断a除以y能否使用 ans++; } } } } write(ans); return 0; }
- 1
信息
- ID
- 8364
- 时间
- 200ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者