E链接
小飞有nn的魔法纸片(可以变出糖果), 现在有m个人来找小飞玩游戏, 小飞希望用魔法纸片来使朋友们开心,纸片可以被随便裁剪,nn的魔法纸片可以裁剪成任意大小的小魔法纸片,小飞通过pubgoso得知,ij尺寸的纸片可以产生(ii+jj)个糖果。小飞希望裁剪的纸片可以让每个朋友分到一样多的糖果,这样他的朋友们就会很开 心,小飞希望知道有多少种合理的裁剪方法使得每个朋友都开心呢?请帮他回答这个问题。

分析一下题意可以得到题目要求的是满足下面这个 公式的不同的i,j的方案数 ( i 2 + j 2 ) m o d &ThinSpace;&ThinSpace; <mtext>   </mtext> m = 0 <mtext>   </mtext> ( n <mtext>   </mtext> <mtext>   </mtext> i , j <mtext>   </mtext> n ) (i^2+j^2)\mod \ m =0\ ( n\ \leq\ i,j\leq \ n) (i2+j2)mod m=0 (n  i,j n)
代码如下

#include <bits/stdc++.h>
using namespace std;
#define LL long long
LL powmod(LL a,LL b,LL MOD)
{
  LL ans=1;
  while(b)
  {
    if(b%2)ans=ans*a%MOD;
    a=a*a%MOD;
    b/=2;
  }
  return ans;
}
int main(){
    LL n,m;
    cin>>n>>m;
    LL ans=0;
    for(LL i=0;i<m;i++){
        for(LL j=0;j<m;j++){
            if((i*i+j*j)%m==0&&i<=n&&j<=n){
                LL a=(n-i)/m+1,b=(n-j)/m+1;
                if(i==0)a--;
                if(j==0)b--;
                ans+=a*b;
            }
        }
    }
    cout<<ans<<endl;
    return 0;
}

J链接
看完题目就知道了,是E的升级版,思路一样

#include <set>
#include <map>
#include <queue>
#include <stack>
#include <math.h>
#include <bitset>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#define MAXN 1010100
#define LL long long
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define ll __int64
#define INF 0x7fffffff
#define cs(s) freopen(s,"r",stdin)
#define mem(x) memset(x,0,sizeof(x))
#define PI acos(-1)
#define eps 1e-10
using namespace std;
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int lcm(int a,int b){return a/gcd(a,b)*b;}
LL powmod(LL a,LL b,LL MOD){LL ans=1;while(b){if(b%2)ans=ans*a%MOD;a=a*a%MOD;b/=2;}return ans;}
//head
const LL mod=1e8+7;
int main(){
    ios::sync_with_stdio(false);
    int n;
    LL m,t,pp=1e18;
    for(cin>>t;t;t--){
        cin>>n>>m;
        LL ans=0;
        for(int i=0;i<m;i++){
            for(int j=0;j<m;j++){
                for(int k=0;k<m;k++){
                    LL mid=1;
                    int flag=0;
                    if((1ll*i*i+1ll*j*j*j+1ll*k*k*k*k)%m==0){
                        if(i<=n)mid=mid*((n-i)/m+(i==0?0:1))%mod,flag=1;
                        if(j<=n)mid=mid*((n-j)/m+(j==0?0:1))%mod,flag=1;
                        if(k<=n)mid=mid*((n-k)/m+(k==0?0:1))%mod,flag=1;
                        if(flag)ans=(ans+mid)%mod;
                    }
                }
            }
        }
        cout<<ans%mod<<endl;
    }
    return 0;
}