合肥学院第二届卓越IT-程序设计大赛E+J
E链接
小飞有nn的魔法纸片(可以变出糖果), 现在有m个人来找小飞玩游戏, 小飞希望用魔法纸片来使朋友们开心,纸片可以被随便裁剪,nn的魔法纸片可以裁剪成任意大小的小魔法纸片,小飞通过pubgoso得知,ij尺寸的纸片可以产生(ii+jj)个糖果。小飞希望裁剪的纸片可以让每个朋友分到一样多的糖果,这样他的朋友们就会很开 心,小飞希望知道有多少种合理的裁剪方法使得每个朋友都开心呢?请帮他回答这个问题。
分析一下题意可以得到题目要求的是满足下面这个 公式的不同的i,j的方案数 (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;
}